2011-12-17 3 views
1

У меня есть контроллер с именем Administrator. Этот контроллер имеет действия для других моделей. Когда я пытаюсь разрешить эти действия с CanCan, я получаю этот ответ.CanCan - Поиск неопределенного метода для определенного класса

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

Код контроллера начинается с:

class AdministratorController < ApplicationController 

    load_and_authorize_resource 
    before_filter :authenticate_user! 

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

end 

модель имеет способность:

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

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 

Я попытался удалить load_and_authorize_r esource от контроллера, но когда вызывается какое-либо действие, CanCan перенаправляет меня на страницу входа каждый раз.

Большое спасибо

ответ

0

Вы не указали разрешение, что это может: значит пользователь? укажите разрешение, для всех разрешений используйте: manage.

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

Да, я пытаюсь с помощью: управлять,: все и получать одинаковый результат. Спасибо – jgiunta

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

Пожалуйста вставьте preproduct_delete из AdministratorController

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

Является ли Администратор наследуя от ActiveRecord :: Base? если он не находит, потому что это не так. должно быть

class Administrator < ActiveRecord::Base 

authenticate_user! метод:

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

ЭТО НЕ authenticate_user! метод, это разрешено! очень разные, у вас есть before_filter authenticate_user! отправьте этот метод здесь. Что-то вызывает preproduct_delete.

+0

Я сделал несколько тестов и проблема, когда камень CanCan хочет проверить разрешения для метода. Я думаю, возможно, это потому, что у меня есть контроллер (администратор), использующий модели diferentes, такие как Preproduct, Product и т. Д. – jgiunta

0

Одна из возможных причин состоит в том, что имя класса должно быть явно задано. В моем примере я имел комментарии ресурс вложен под ресурсом резьбы, и я писал следующее в контроллере:

class Buy::CommentsController < ApplicationController 
    load_and_authorize_resource :thread 

Это дает мне undefined find method ошибку, потому что комментарий модель была под пространством имен потока. Когда я явно устанавливаю его так, как это работает, он работает.

class Buy::CommentsController < ApplicationController 
    load_and_authorize_resource :thread, class: Buy::Thread 
Смежные вопросы