2011-12-17 65 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来自控制器的资源,但是当任何操作被调用时,CanCan每次都会将我重定向到登录页面。

非常感谢

回答

0

您没有指定权限,用户意味着什么?指定一个权限,为所有权限使用:manage。

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

是的,我试着用can:manage,:all得到相同的结果。谢谢 – jgiunta 2011-12-18 14:43:08

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 

THIS IS NOT发生authenticate_user!方法,这是授权! 非常不同,你有before_filter authenticate_user!在这里发布这个方法。有些东西正在调用preproduct_delete。

+0

我做了一些测试,以及CanCan gem想要检查方法权限的问题。我想也许这是因为我有一个控制器(管理员)使用像Preproduct,Product等diferentes模型。 – jgiunta 2011-12-19 13:46:32

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