【问题标题】:Cancancan passing an object through ability checkCancancan 通过能力检查传递一个对象
【发布时间】: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个房间。

标签: ruby-on-rails cancan user-roles cancancan


【解决方案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 它通过了检查。但仅限于新建和创建
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
相关资源
最近更新 更多