当cancan的load_and_authorize_resource
找不到对象的实例时,它落后于授权对象的类本身。
从Cancan Wiki复制:
添加授权_Resource将安装一个forter_action回调,该回调呼叫授权!,如果存在资源实例变量。如果未设置实例变量(例如在索引操作中(,则将通过类名。例如,如果我们有一个productscontroller,它将在每个动作之前执行此操作。
authorize!(params[:action].to_sym, @product || Product)
和默认情况下,Cancan似乎将行为授予对象类。首先,我发现这种行为令人恐惧。但是除了那样,我无法弄清楚语法是为了防止访问该类的语法。
在上面的情况下, @product
nil的位置,您在能力文件中放置了什么以防止cancan允许访问?
在类上设置权限的语法是什么(而不是该类的操作(?
如果设置正常权限的语法为:
can [:edit], Page do |page|
page.author == user
end
那么,在类本身上设置权限的语法是什么:
# This doesn't work
can [:edit], Page do |page|
false if !page
page.author == user
end
但是什么?
不喜欢"链接答案",但事实。
来自Cancan Wiki
# don't do this
can :update, Project do |project|
user.admin? # this won't be called for Project.accessible_by(current_ability, :update)
end
# do this
can :update, Project if user.admin?
解决方案很简单:不要使用 load_and_authorize_resource
并亲自调用 authorize!
。这样的东西:
def index
authorize!(:index, Product)
...
end
def show
@product = Product.find(params[:id])
authorize!(:show, @product)
...
end
您必须输入更多,但另一方面,没有魔术后卫。