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.newload_and_authorize_resource 方法可以为您做到这一点。所以我的假设是你正在覆盖它正在初始化的那个。

这同样适用于RoomsController 中的所有其他方法,除非您想覆盖图像的加载方式(急切加载等)或搜索方式。

【讨论】:

即使删除了@room = Room.new,我仍然遇到同样的问题 另外,我应该补充一下,您的问题表明您想在 new/create 方法中检查此功能。但是对于 new/create load_and_authorize 部分只是初始化一个值并使用查询参数填充它(在创建的情况下)。 B/c 你说用户可以管理Rooms,他们总是可以创建它们。在这种情况下没有真正的授权(检查组 id)。 但它正在检查它是否新建和创建。 当我有can :manage, Room, :group =&gt; :id =&gt; user.group_id 它失败了,但是当我只有can :manage, Room 它通过了检查。但仅限于新建和创建

以上是关于Cancancan 通过能力检查传递一个对象的主要内容,如果未能解决你的问题,请参考以下文章

Rails - CanCanCan - 常用能力

Rails、Devise、Role Model 和 CanCanCan - 定义能力

ruby 为cancancan编写能力文件的示例

基于部门的 Rails CanCanCan 资源能力

Rails的基于部门CanCanCan资源的能力

为什么用户可以创建帖子,如果`不能:管理,发布`在能力类(CanCanCan)?