[英]Accessing main app's CanCan rules from within Rails 3.1 engine
我正在嘗試使用Forem gem,恰好使用CanCan授權框架以及我的主要應用程序。 主應用程序和Rails引擎都有自己的ability.rb文件。
當我嘗試進行一些授權檢查時,問題會出現在布局中:
<% if can? :update, User %>
<%= link_to_current_user :content_method => :login %>.
<% else %>
當我在引擎上使用布局文件時,它會查詢自己的ability.rb文件以進行授權。 當然,我的主要應用程序沒有規則,因此授權失敗時不應該。 有什么方法可以強迫它去“主要”CanCan嗎?
謝謝。
我認為最簡單的解決方案是修補forem的定義以添加自己的聲明:
class Forem::Ability
alias_method :orig_init, :initialize
def initialize(user)
orig_init(user)
# Put your own authorization code here.
end
end
class Ability < Forem::Ability; end
在發動機的情況下can?
方法必須使用引擎的控制器/命名空間來授權操作( Forem::Ability
),當在您自己的應用程序的上下文中時,它使用您自己的控制器而沒有命名空間來執行相同操作。
因此,我認為這里的解決方案(將為Ability
和Forem::Ability
添加所有授權操作應解決您的問題。
更新:我現在意識到引擎的控制器的current_ability
方法可能是這樣的:
def current_ability
@current_ability ||= Forem::Ability.new(current_user)
end
而你的(從cancan寶石中默認)讀取的內容如下:
def current_ability
@current_ability ||= Ability.new(current_user)
end
所以我上面的解決方案應該可以解決您的問題,但這可能是它所遇到的具體問題。
到目前為止,我發現的唯一方法是將兩個文件合並為一個,將它分成模塊和猴子補丁啟動時的兩種能力。 不漂亮..
我仍然是紅寶石的初學者,但我希望通過以下方式幫助你。
更新
如cancan / wiki / admin-namespace所述,另一個要嘗試的問題是選擇要為模型加載的能力文件。
創建自己的模型:
# in models/admin_ability.rb
class AdminAbility
include CanCan::Ability
def initialize(user)
# define admin abilities here ....
end
end
然后,將它用於您的模型
def current_ability
@current_ability ||= AdminAbility.new(current_user)
end
我希望這個解決方案可以解決您的問題。
斯蒂芬
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.