如何在环境/ * .rb中解析配置符号

这是典型的config/environments/*.rb文件的开头方式:

 MyApp::Application.configure do config.cache_classes = false ... end 

传递给configure的块解除引用显然未绑定的符号config 。 这在技术上如何工作? 块/ Proc / lambda中使用的符号应该在其声明的上下文中绑定,而不是在调用站点的动态范围中解析。

一个相关的问题是, Application.configure方法究竟在哪里声明? 它不在application.rbengine.rbrailtie.rb 。 也许如果我设法找到这个方法,我会找到我的主要问题的答案。

还有相关的,我已经研究了Rails初始化过程中令人难以忍受的细节,我甚至找不到提到config/environments/*.rb文件。 如果我知道init程序如何处理这些文件,那可能会对此有所了解。

它是在lib/rails/application.rb中的railties gem中的Rails::Application中的方法config ,它返回在lib/rails/application/configuration.rb定义的Application::Configuration实例。

configure方法由autoload模块Configurablelib/rails/railtie/configurable贡献给Railtie ,并定义为

 def configure(&block) class_eval(&block) end 

这解释了为什么configure接受的块可以解析config符号。 请注意, class_eval是另一个使用它的rubyist魔法:它将传入块的self符号重新绑定到调用站点的类。

检查“引导过程”部分中第一个文件中的注释,该部分说明了所有这些优点的来源,方式和顺序,包括如何处理/config/environments目录。