Mar*_*nik 8 ruby-on-rails ruby-on-rails-3
这是典型config/environments/*.rb文件的开始方式:
MyApp::Application.configure do
config.cache_classes = false
...
end
Run Code Online (Sandbox Code Playgroud)
该块传递给configure取消引用config显然未绑定的符号.这在技术上如何工作?块/ Proc/lambda中使用的符号应该在其声明的上下文中绑定,而不是在呼叫站点的动态范围中解析.
一个相关的问题是,Application.configure声明的方法究竟在哪里?这不是在任application.rb,engine.rb或railtie.rb.也许如果我设法找到这个方法,我会找到我的主要问题的答案.
还有相关的,我已经研究了Rails初始化过程中令人难以忍受的细节,我甚至找不到config/environments/*.rb文件的提及.如果我知道init程序如何处理这些文件,那可能会对此有所了解.
它是Railties gem 中的一个方法,其中config返回的实例,在 中定义。Rails::Applicationlib/rails/application.rbApplication::Configurationlib/rails/application/configuration.rb
该方法由ed 模块configure贡献,定义为RailtieautoloadConfigurablelib/rails/railtie/configurable
def configure(&block)
class_eval(&block)
end
Run Code Online (Sandbox Code Playgroud)
这解释了为什么接受的块configure可以解析该config符号。请注意,这class_eval是使这项工作有效的另一个 Rubyist 魔法:它将传入的块的self符号重新绑定到调用站点的类。
检查引导过程部分第一个文件中的注释,其中解释了所有这些优点的来源、方式和顺序,包括如何/config/environments处理目录。
| 归档时间: |
|
| 查看次数: |
147 次 |
| 最近记录: |