我正在使用Cancancan设置管理能力。我有一个协会,其中房间
has_one :group, through: :property
我知道不能使用 cancancan 传递对象,但我们可以使用哈希来检查能力。
#ability.rb
if user.has_role?(:admin)
can :manage, Room, :group => { :id => user.group_id }
end
上述能力检查在我加载索引、显示、更新、编辑和销毁方法时有效,但在加载新方法或创建方法时不起作用。我知道 Cancancan 将任何条件作为哈希传递,就像这样,但我不认为它传递了我的哈希,因为组被设置为关联而不是每个房间对象上的列。
#rooms_controller.rb
class RoomsController < ApplicationController
load_and_authorize_resource
def new
@room = Room.new
end
end
我的问题是,如何在新方法和创建方法上检查此功能,最好不要向对象添加新列。
任何帮助不胜感激
谢谢
如果你正在使用load_and_authorize_resource
,你不应该在new
方法中做@room = Room.new
。load_and_authorize_resource
方法可以为您做到这一点。所以我的假设是你正在覆盖它正在初始化的那个。
这同样适用于 RoomsController
中的所有其他方法,除非您想覆盖图像的加载方式(预先加载等)或搜索方式。
尝试执行以下操作。
要检查具有自定义属性的规则,您创建的新对象必须具有这些属性。 即具有当前用户group_id的房间
#rooms_controller.rb
class RoomsController < ApplicationController
def new
@room = Room.new(group_id: current_user.group_id)
authorize! @room
end
end
或者,我认为您可以通过 https://github.com/CanCanCommunity/cancancan/blob/develop/docs/changing_defaults.md#strong-parameters 为操作指定自定义参数
所以这可能(我还没有测试过)看起来像:
#rooms_controller.rb
class RoomsController < ApplicationController
load_and_authorize_resource
def new
puts @room
end
def room_params
@room_params = params.require(:room).permit(:group_id)
@room_params[:room].merge(group_id: current_user.group_id) # ??
@room_params
end
end
也就是说,您甚至可能不想限制新操作,因为资源不会创建任何内容,因此谁到达此处可能无关紧要。