1

我有一个名为 X 的 rails 应用程序和一个名为 Y 的 rails 可安装引擎。App X 具有设计,引擎 Y 具有 CanCan,可与主机应用程序设计安装一起使用。为了分离宿主应用程序和可挂载引擎的关注点,引擎具有CanCan能力模型以及宿主应用程序。我的问题如下,根据 CanCan 文档,您可以像https://github.com/ryanb/cancan/wiki/Changing-Defaults一样更改默认能力模型。我的问题是,如果我在可安装引擎应用程序控制器中设置默认能力类,如下所示:

module Y
  class ApplicationController < ActionController::Base
    def current_ability 
      @current_ability = Ability.new(current_user)
    end
  end
end

我收到以下错误:

uninitialized constant Ability

(附带说明,当我编辑文件并重新加载页面而不重新启动服务器时,它工作正常)

但是,如果我将相同的方法放入主机应用程序的应用程序控制器中:

class ApplicationController < ActionController::Base
  def current_ability 
    @current_ability = Y::Ability.new(current_user)
  end
end

一切都按预期工作(这也意味着 Devise 和 CanCan 设置正确)。

有人知道为什么会这样吗?我可能无法正确理解可挂载引擎,但我一直认为它们与主机应用程序是隔离的,因此在访问由可挂载引擎定义的页面时,主机应用程序的应用程序控制器甚至不应该被执行。

4

1 回答 1

0

您的引擎应用程序控制器很可能根本没有加载。如果您在主应用程序中具有相同的类名,Rails 引擎会表现不佳。如果您想查看,这就是问题所在。我建议在您的引擎中使用显式声明。使用 Y::Ability 代替能力。

于 2012-05-22T20:54:44.583 回答