为什么要明确要求在Rails的引擎应用控制器?

问题描述 投票:3回答:2

我建立一个Rails的引擎,我发现,如果我生成一个控制器,像这样rails g controller test它给了我下面的输出:

require_dependency "my_app/application_controller"

module MyApp
 class TestController < ApplicationController
 end
end

为什么有必要要求发动机的应用控制器,下module MyApp嵌套应该已经从主应用程序的澄清对ApplicationControlller。

ruby-on-rails rails-engines
2个回答
3
投票

所以,我没有通过轨道源的一些挖掘和发现提交谁介绍这个功能(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,最简单的解决方法是只明确加载应用程序控制器。

因此,作为一个可能已经猜到了,这可以归结为一个自动加载的问题!所以请记住孩子,总是作出明确导入哪些具有潜在的暧昧代码打交道时。什么是真正令人不安的是,通过发动机引入的命名空间,确实没有提供太多的隔离,想象您引用一些其他非轨道类的发动机和包括主要的应用恰好具有相同名称的常量,同问题将适用。


0
投票

我指出这个职位的same issue within Component-based Rails apps。这里留下了我的想法以供将来参考...

安装发动机配备了一个命名空间,这使得解决这一问题的另一种方式:总是引用每一个类明确其命名空间,即Blog::ApplicationController

在你的情况,下面的代码不会有那样的问题(没有必要明确require)。

module Blog
  class PostsController < Blog::ApplicationController
  end
end

当然,你仍然可能会遇到两个命名空间/类组合在应用程序中显示的问题,但这将是更加罕见的,更容易地发现...

© www.soinside.com 2019 - 2024. All rights reserved.