[英]Why doesn't the data is not displayed when going through the ability check?(rails,cancancan)
[英]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.