这是典型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 initialization procedure令人难以忍受的细节,我甚至找不到config/environments/*.rb
文件。如果我知道init程序如何处理这些文件,那可能会对此有所了解。
答案 0 :(得分:3)
config
中的Rails::Application
中lib/rails/application.rb
中的方法Application::Configuration
,它返回lib/rails/application/configuration.rb
中定义的configure
实例。
方法Railtie
由autoload
ed模块Configurable
,lib/rails/railtie/configurable
提供给def configure(&block)
class_eval(&block)
end
,并定义为
configure
解释了config
接受的块可以解析class_eval
符号的原因。请注意self
是另一个使用它的rubyist魔法:它将传入的块的/config/environments
符号重新绑定到调用站点的类。
检查“引导过程”部分中第一个文件中的注释,该部分说明了所有这些优点的来源,方式和顺序,包括如何处理{{1}}目录。