2011-10-07 4 views
2

J'utilise CanCan et j'ai rencontré une erreur que je n'arrive pas à diagnostiquer.Problème avec le chargement des ressources CanCan

Certains utilisateurs testant mon application ont reçu NoMethodError: undefined method 'where' for nil:NilClass en provenance de la ligne indiquée ci-dessous.

Dans quelles circonstances load_and_authorize_resource laisserait @jobs comme nil à ce stade?

class JobsController < ApplicationController 
    load_and_authorize_resource 

    def index 
    if Job::STATES.include? params[:state] 
     if params[:state] == 'in_progress' 
     @jobs = @jobs.where(['state = ? or state = ?', params[:state], 'needs_confirmation']) 
     else 
     ################################################### 
     # Error thrown here 
     @jobs = @jobs.where(['state = ?', params[:state]]) 
     ################################################### 
     end 
    end 
    end 

end 

Et le code relevent cancan:

if user.role? :employee 
    can :read, Job do |j| 
    (j.employee == user) or (j.employee == nil) 
    end 
end 
+0

Pouvez-vous montrer le code 'cancan' pertinent? – rdvdijk

+0

modifié avec le code CanCan approprié – Luke

Répondre

1

vous devriez faire Job.where(...) - vous obtenez cette erreur parce que vous appelez en effet where sur une variable d'instance nulle. Personnellement, je ne compte pas trop sur load_resource, il n'y a pas de mal à être explicite.

+1

J'utilise 'load_and_authorize_resource' car il gère le tri seulement des tâches que l'utilisateur actuel est autorisé à voir. Je suis d'accord qu'il n'y a pas de mal à être explicite, mais je ne comprends pas pourquoi la méthode auxiliaire échoue dans cette situation. Son but est de définir la variable '@ jobs', donc je ne vois pas pourquoi il reste' nil'. Est-ce que je manque quelque chose? – Luke

+0

Avez-vous vérifié votre autorisation? Il est possible que l'utilisateur actuel ne puisse pas accéder à la ressource, donc il est chargé comme nul. Définissez votre auth à 'can: manage,: all' et voyez si' @ jobs' est nul ou pas. Vous pouvez également gérer différemment ce que vous faites dans 'jobs # index' en fonction de l'authentification de l'utilisateur - consultez les documents de CanCan pour plus de détails à ce sujet. –

+0

Je pense que cela a à voir avec l'autorisation, car les utilisateurs avec un rôle 'admin' qui peut: gérer,: all' n'ont pas ce problème. Cela n'est possible que pour les utilisateurs dont le rôle 'employee' est indiqué dans le code de CanCan. Mais ce rôle est clairement autorisé à lire certains travaux, donc je ne sais pas ce qui provoquerait 'load_resource' pour retourner' nil'. S'il n'y a aucun travail correspondant, il devrait retourner un tableau vide. – Luke

Questions connexes