我有一个名为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每次都会将我重定向到登录页面。
非常感谢
答案 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