如何在环境/ * .rb中解析配置符号
这是典型的config/environments/*.rb
文件的开头方式:
MyApp::Application.configure do config.cache_classes = false ... end
传递给configure
的块解除引用显然未绑定的符号config
。 这在技术上如何工作? 块/ Proc / lambda中使用的符号应该在其声明的上下文中绑定,而不是在调用站点的动态范围中解析。
一个相关的问题是, Application.configure
方法究竟在哪里声明? 它不在application.rb
, engine.rb
或railtie.rb
。 也许如果我设法找到这个方法,我会找到我的主要问题的答案。
还有相关的,我已经研究了Rails初始化过程中令人难以忍受的细节,我甚至找不到提到config/environments/*.rb
文件。 如果我知道init程序如何处理这些文件,那可能会对此有所了解。
它是在lib/rails/application.rb
中的railties gem中的Rails::Application
中的方法config
,它返回在lib/rails/application/configuration.rb
定义的Application::Configuration
实例。
configure
方法由autoload
模块Configurable
, lib/rails/railtie/configurable
贡献给Railtie
,并定义为
def configure(&block) class_eval(&block) end
这解释了为什么configure
接受的块可以解析config
符号。 请注意, class_eval
是另一个使用它的rubyist魔法:它将传入块的self
符号重新绑定到调用站点的类。
检查“引导过程”部分中第一个文件中的注释,该部分说明了所有这些优点的来源,方式和顺序,包括如何处理/config/environments
目录。