康灿通过能力检查传递对象



我正在使用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.newload_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

也就是说,您甚至可能不想限制操作,因为资源不会创建任何内容,因此谁到达此处可能无关紧要。

最新更新