从Rails 3.1引擎中访问主应用程序的CanCan规则

ale*_*333 5 ruby ruby-on-rails cancan ruby-on-rails-3

我正在尝试使用Forem gem,恰好使用CanCan授权框架以及我的主要应用程序.主应用程序和Rails引擎都有自己的ability.rb文件.

当我尝试进行一些授权检查时,问题会出现在布局中:

    <% if can? :update, User %>
        <%= link_to_current_user :content_method => :login %>.
    <% else %>
Run Code Online (Sandbox Code Playgroud)

当我在引擎上使用布局文件时,它会查询自己的ability.rb文件以进行授权.当然,我的主要应用程序没有规则,因此授权失败时不应该.有什么方法可以强迫它去"主要"CanCan吗?

谢谢.

nzi*_*nab 4

我认为最简单的解决方案是对 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
Run Code Online (Sandbox Code Playgroud)

当在引擎的上下文中时,该can?方法必须使用引擎的控制器/命名空间来授权操作 ( Forem::Ability),当在您自己的应用程序的上下文中时,它使用您自己的控制器而不是命名空间来执行相同的操作。

因此,我认为这里的解决方案(它将向两者添加所有授权操作,Ability并且Forem::Ability应该解决您的问题。

更新:我现在意识到引擎控制器的current_ability方法可能是这样的:

def current_ability
  @current_ability ||= Forem::Ability.new(current_user)
end
Run Code Online (Sandbox Code Playgroud)

你的(默认来自 cancan gem)读起来像:

def current_ability
  @current_ability ||= Ability.new(current_user)
end
Run Code Online (Sandbox Code Playgroud)

因此,我上面的解决方案应该可以解决您的问题,但这可能是它所遇到的具体问题。