2011-12-17 6 views
1

J'ai un contrôleur nommé Administrator. Ce contrôleur a des actions sur les autres modèles. Lorsque j'essaie d'autoriser ces actions avec CanCan, j'obtiens cette réponse.CanCan - Méthode non trouvée trouvée pour une classe spécifique

<h1> 
    NoMethodError 
    in AdministratorController#preproduct_delete 
</h1> 
<pre>undefined method `find' for Administrator:Class</pre> 

Le code du contrôleur commence par:

class AdministratorController < ApplicationController 

    load_and_authorize_resource 
    before_filter :authenticate_user! 

    def users 
    authorize! :users, "Users List" 
    @users = User.all 
    end 

end 

Le modèle de capacité a:

if user.admin? then :admin 
    can :users 
end 

La méthode authenticate_user!:

# See ControllerAdditions#authorize! for documentation. 
def authorize!(action, subject, *args) 
    message = nil 
    if args.last.kind_of?(Hash) && args.last.has_key?(:message) 
    message = args.pop[:message] 
    end 
    if cannot?(action, subject, *args) 
    message ||= unauthorized_message(action, subject) 
    raise AccessDenied.new(message, action, subject) 
    end 
    subject 
end 

J'ai essayé de supprimer load_and_authorize_r esource du contrôleur, mais quand une action est appelée, CanCan me redirige vers la page de connexion à chaque fois.

Merci beaucoup

Répondre

0

Vous n'avez pas précisé l'autorisation, qu'est-ce que peut: l'utilisateur veut dire? spécifiez une permission, pour toutes les permissions, utilisez: manage.

if user.admin? 
    can :manage, :users 
end 
+0

Oui j'essaie avec: gérer,: tous et obtenir le même résultat. Merci – jgiunta

0
<h1> 
    NoMethodError 
    in AdministratorController#preproduct_delete 
</h1> 

S'il vous plaît coller preproduct_delete de AdministratorController

<pre>undefined method `find' for Administrator:Class</pre> 

administrateur en héritant de ActiveRecord :: Base? si elle n'a pas trouvé, c'est parce que non. il devrait être

class Administrator < ActiveRecord::Base 

La méthode authenticate_user!:

# See ControllerAdditions#authorize! for documentation. 
def authorize!(action, subject, *args) 
.... 
end 

CECI EST PAS le authenticate_user! méthode, c'est autoriser! très différent, vous avez before_filter authenticate_user! poster cette méthode ici. Quelque chose appelle preproduct_delete.

+0

J'ai fait quelques tests et le problème c'est quand CanCan gem veut vérifier les permissions pour la méthode. Je pense que c'est peut-être parce que j'ai un contrôleur (administrateur) en utilisant des modèles diferentes comme Preproduct, Product, etc. – jgiunta

0

Une raison possible est que le nom de classe doit être explicitement défini. Dans mon exemple, j'ai eu la ressource de commentaires imbriqués dans la ressource de fil, et j'écrivais ce qui suit dans le contrôleur:

class Buy::CommentsController < ApplicationController 
    load_and_authorize_resource :thread 

Cela me donne undefined find method erreur, car le modèle de commentaire était sous l'espace de noms de fil. Lorsque je le définis explicitement comme suit, cela fonctionne.

class Buy::CommentsController < ApplicationController 
    load_and_authorize_resource :thread, class: Buy::Thread