Cancancan 通过能力检查传递一个对象
Posted
技术标签:
【中文标题】Cancancan 通过能力检查传递一个对象【英文标题】:Cancancan passing an object through ability check 【发布时间】:2016-06-08 14:44:49 【问题描述】:我正在使用 Cancancan 设置管理员权限。我有一个关联的房间
has_one :group, through: :property
我知道无法通过使用 cancancan 传递对象,但我们可以使用哈希来检查能力。
#ability.rb
if user.has_role?(:admin)
can :manage, Room, :group => :id => user.group_id
end
上述能力检查在我加载我的索引、显示、更新、编辑和销毁方法时有效,但在我加载新方法或创建方法时无效。 我知道 Cancancan 将任何条件作为散列传递,例如 this,但我认为它不会传递我的散列,因为组被设置为关联而不是每个房间对象上的列。
#rooms_controller.rb
class RoomsController < ApplicationController
load_and_authorize_resource
def new
@room = Room.new
end
end
我的问题是,我怎样才能在 new 和 create 方法上检查这种能力,最好不要向我的对象添加新列。
感谢任何帮助
谢谢
【问题讨论】:
什么时候设置房间属于哪个组? 它通过创建时的属性进行设置。每组大约有6个房产,每个房产大约有10个房间。 【参考方案1】:如果您使用load_and_authorize_resource
,则不应在new
方法中使用@room = Room.new
。 load_and_authorize_resource
方法可以为您做到这一点。所以我的假设是你正在覆盖它正在初始化的那个。
这同样适用于RoomsController
中的所有其他方法,除非您想覆盖图像的加载方式(急切加载等)或搜索方式。
【讨论】:
即使删除了@room = Room.new
,我仍然遇到同样的问题
另外,我应该补充一下,您的问题表明您想在 new/create 方法中检查此功能。但是对于 new/create load_and_authorize
部分只是初始化一个值并使用查询参数填充它(在创建的情况下)。 B/c 你说用户可以管理Rooms
,他们总是可以创建它们。在这种情况下没有真正的授权(检查组 id)。
但它正在检查它是否新建和创建。
当我有can :manage, Room, :group => :id => user.group_id
它失败了,但是当我只有can :manage, Room
它通过了检查。但仅限于新建和创建以上是关于Cancancan 通过能力检查传递一个对象的主要内容,如果未能解决你的问题,请参考以下文章