8

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

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

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

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

同样相关的是,我已经非常详细地研究了Rails 初始化过程,我什至找不到config/environments/*.rb文件的提及。如果我知道初始化过程如何处理这些文件,那可能会对此有所了解。

4

1 回答 1

3

它是 railties gem 中config的一个方法,它返回一个实例,定义在.Rails::Applicationlib/rails/application.rbApplication::Configurationlib/rails/application/configuration.rb

该方法configure由ed 模块, ,Railtie提供, 并定义为autoloadConfigurablelib/rails/railtie/configurable

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

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

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

于 2012-11-16T21:03:52.403 回答