ruby-on-rails 康康康让一个物体通过能力检定

x8diyxa7  于 2023-02-01  发布在  Ruby
关注(0)|答案(2)|浏览(78)

我在用康康康设置一个管理能力。我有一个协会
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方法上检查这种能力,最好不要向对象添加新列。
任何帮助都很感激
谢谢

o3imoua4

o3imoua41#

如果你使用的是load_and_authorize_resource,你不应该在new方法中执行@room = Room.newload_and_authorize_resource方法会为你做这些,所以我的假设是你覆盖了它正在初始化的那个。
这同样适用于RoomsController中的所有其他方法,除非您想覆盖加载(紧急加载等)或搜索图像的方式。

0kjbasz6

0kjbasz62#

尝试执行以下操作。
要对照具有自定义属性的规则进行检查,您创建的新对象必须具有这些属性,例如具有当前用户group_id的文件室

#rooms_controller.rb

class RoomsController < ApplicationController 
  def new
    @room = Room.new(group_id: current_user.group_id)
    authorize! @room
  end
end

或者,我认为您可以通过www.example.com为操作指定自定义参数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

也就是说,您甚至可能不想限制 new 操作,因为资源不创建任何东西,所以谁访问这里可能并不重要。

相关问题