我有一个名为X的rails应用程序和一个名为Y的rails可安装引擎。 App X有Devise,引擎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设置正确)。
任何人都知道为什么会这样?我可能无法正确理解可安装引擎,但我一直认为它们与主机应用程序是隔离的,因此当访问可安装引擎定义的页面时,主机应用程序的应用程序控制器甚至不应该被执行。
答案 0 :(得分:0)
很可能根本没有加载您的引擎应用程序控制器。如果主应用程序中具有相同的类名,则Rails引擎会表现不佳。 here is the issue if you want to look at.我建议您在引擎中使用显式声明。使用Y :: Ability而不是Ability。