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

时间:2012-11-16 20:46:34

标签: ruby-on-rails ruby-on-rails-3

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

方法Railtieautoload ed模块Configurablelib/rails/railtie/configurable提供给def configure(&block) class_eval(&block) end ,并定义为

configure

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

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