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

标签 ruby-on-rails ruby ruby-on-rails-3 cancan

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

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

    <% if can? :update, User %>
        <%= link_to_current_user :content_method => :login %>.
    <% else %>

当我在引擎上使用布局文件时,它会引用自己的 ability.rb 文件进行授权。自然地,我的主应用程序没有规则,所以授权在不应该的时候失败了。我有什么办法可以强制它转到“主要”CanCan 吗?

谢谢。

最佳答案

我认为最简单的解决方案是对 monkey-patch 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? 方法必须使用引擎的 Controller /命名空间来授权操作 (Forem::Ability),而在您自己的上下文中应用程序的上下文它使用您自己的 Controller 而不是命名空间来执行相同的操作。

因此,我认为这里的解决方案(将所有授权操作添加到 AbilityForem::Ability 应该可以解决您的问题。

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

def current_ability
  @current_ability ||= Forem::Ability.new(current_user)
end

而你的(默认来自 cancan gem)是这样的:

def current_ability
  @current_ability ||= Ability.new(current_user)
end

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

关于ruby-on-rails - 从 Rails 3.1 引擎中访问主应用程序的 CanCan 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9885222/

相关文章:

ruby - 让 gem 的 rake 任务随处可用?

Ruby URI - 如何在 URL 之后获取完整路径

jquery ui 自动完成 : remote source problem

mysql - 如何给 "push ahead"记录一个给定的值?

ruby-on-rails - ActionController::UnknownFormat 错误

ruby-on-rails - Rails 急于加载所有记录但仍生成 N+1 查询

ruby-on-rails - `rails s` 表示 "` 在 Windows RailsInstaller 中需要 ': cannot load such file -- pty (LoadError)"

ruby-on-rails - 要使用 :country input, 请安装 country_select 插件

ruby-on-rails - Ruby 编码问题

html - 是否只能在 Ruby on Rails 项目中使用 HAML?