簡體   English   中英

Cancancan 通過能力檢查 object

[英]Cancancan passing an object through ability check

我正在使用 Cancancan 設置管理功能。 我有一個協會,其中一個房間

has_one:group, through: :property

我知道不能通過使用 cancancan 傳遞 object,但我們可以使用 hash 來檢查能力。

#ability.rb

if user.has_role?(:admin)    
  can :manage, Room, :group => { :id => user.group_id }  
end

上述能力檢查在我加載索引、顯示、更新、編輯和銷毀方法時有效,但在加載新方法或創建方法時無效。 我知道 Cancancan 通過任何條件作為 hash,就像這樣,但我不認為它通過了我的 hash,因為組被設置為關聯而不是每個房間 object 上的列。

#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所有其他方法。

嘗試執行以下操作。

要檢查具有自定義屬性的規則,您創建的新 object 必須具有這些屬性。 即具有當前用戶的 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

也就是說,您甚至可能不想限制操作,因為資源不會創建任何東西,所以誰來這里可能並不重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM