我建立一个Rails的引擎,我发现,如果我生成一个控制器,像这样rails g controller test
它给了我下面的输出:
require_dependency "my_app/application_controller"
module MyApp
class TestController < ApplicationController
end
end
为什么有必要要求发动机的应用控制器,下module MyApp
嵌套应该已经从主应用程序的澄清对ApplicationControlller。
所以,我没有通过轨道源的一些挖掘和发现提交谁介绍这个功能(SHA:7c95be54)
修复发电机,以帮助暧昧
ApplicationController
问题在发展模式,依赖关系在运行时动态加载,使用
const_missing
。正因为如此,当常量之一已经被加载并const_missing
不会被触发,用户可以用意想不到的结果告终。鉴于这样的文件在发动机:
module Blog
class PostsController < ApplicationController
end
end
如果你第一次加载,加载任何应用程序文件之前,它会正确加载
Blog::ApplicationController
,因为第二条线将达到const_missing
。但是,如果您加载ApplicationController
第一,不断将已加载,const_missing
钩不会被解雇,并在结果PostsController
将从ApplicationController
而不是Blog::ApplicationController
继承。因为它不能被固定在
AS::Dependencies
,最简单的解决方法是只明确加载应用程序控制器。
因此,作为一个可能已经猜到了,这可以归结为一个自动加载的问题!所以请记住孩子,总是作出明确导入哪些具有潜在的暧昧代码打交道时。什么是真正令人不安的是,通过发动机引入的命名空间,确实没有提供太多的隔离,想象您引用一些其他非轨道类的发动机和包括主要的应用恰好具有相同名称的常量,同问题将适用。
我指出这个职位的same issue within Component-based Rails apps。这里留下了我的想法以供将来参考...
安装发动机配备了一个命名空间,这使得解决这一问题的另一种方式:总是引用每一个类明确其命名空间,即Blog::ApplicationController
。
在你的情况,下面的代码不会有那样的问题(没有必要明确require
)。
module Blog
class PostsController < Blog::ApplicationController
end
end
当然,你仍然可能会遇到两个命名空间/类组合在应用程序中显示的问题,但这将是更加罕见的,更容易地发现...