CanCan - 特定类的未定义方法查找

时间:2011-12-17 18:43:10

标签: ruby-on-rails cancan

我有一个名为Administrator的控制器。该控制器具有对其他模型的操作。当我尝试用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_resource,但是当调用任何操作时,CanCan每次都会将我重定向到登录页面。

非常感谢

3 个答案:

答案 0 :(得分:0)

您没有指定权限,可以做什么:用户是什么意思?指定权限,对所有权限使用:manage。

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

答案 1 :(得分:0)

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

请粘贴AdministratorController的preproduct_delete

<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。

答案 2 :(得分: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