繁体   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