簡體   English   中英

從Rails 3.1引擎中訪問主應用程序的CanCan規則

[英]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 ),當在您自己的應用程序的上下文中時,它使用您自己的控制器而沒有命名空間來執行相同操作。

因此,我認為這里的解決方案(將為AbilityForem::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.

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