我在用康康康设置一个管理能力。我有一个协会has_one :group, through: :property
我知道你不能用cancancan传递一个物体,但是我们可以用散列来检查能力。
#ability.rb
if user.has_role?(:admin)
can :manage, Room, :group => { :id => user.group_id }
end
上述能力检查在我加载index,show,update,edit和destroy方法时有效,但在我加载new或create方法时无效。我知道Cancancan将任何条件作为哈希值传递,就像这样,但我不认为它会传递我的哈希值,因为组被设置为一个关联,而不是每个房间对象上的一列。
#rooms_controller.rb
class RoomsController < ApplicationController
load_and_authorize_resource
def new
@room = Room.new
end
end
我的问题是,如何在new和create方法上检查这种能力,最好不要向对象添加新列。
任何帮助都很感激
谢谢
2条答案
按热度按时间o3imoua41#
如果你使用的是
load_and_authorize_resource
,你不应该在new
方法中执行@room = Room.new
,load_and_authorize_resource
方法会为你做这些,所以我的假设是你覆盖了它正在初始化的那个。这同样适用于
RoomsController
中的所有其他方法,除非您想覆盖加载(紧急加载等)或搜索图像的方式。0kjbasz62#
尝试执行以下操作。
要对照具有自定义属性的规则进行检查,您创建的新对象必须具有这些属性,例如具有当前用户group_id的文件室
或者,我认为您可以通过www.example.com为操作指定自定义参数https://github.com/CanCanCommunity/cancancan/blob/develop/docs/changing_defaults.md#strong-parameters
因此,* 可能 *(我还没有测试)看起来像:
也就是说,您甚至可能不想限制 new 操作,因为资源不创建任何东西,所以谁访问这里可能并不重要。