【发布时间】:2018-01-22 10:21:39
【问题描述】:
在 Rails 中,经常会看到这样的模式(例如在 config/environments/development.rb 中):
Rails.application.configure do
config.some_option = some_value
end
我对这个成语很感兴趣,因为我最近在研究这些配置 blocks 如何工作并最终发现 this very similar pattern,其中 configure 方法初始化配置类的(通常是记忆的)实例(具有配置选项的访问器)并将该实例对象产生给块。像这样的:
module Clearance
class << self
attr_accessor :configuration
end
def self.configure
self.configuration ||= Configuration.new
yield(configuration)
end
class Configuration
attr_accessor :mailer_sender
def initialize
@mailer_sender = 'donotreply@example.com'
end
end
end
这就是Clearance.configure {|config| config.mailer_sender = 'something'} 起作用的原因,因为它将配置类的实例产生给块变量config。
但是 Rails 这样做的方式是,没有将变量传递给该块。没有Rails.application.configure do |config|,因此该块可以更改配置对象访问器。我以为config 在该块内是未定义的,但事实并非如此。
尝试查看 rails 源代码,我怀疑它与 configurable module 有关,但我无法 100% 理解我在那里找到的代码。
【问题讨论】:
-
我正在标记这个 Ruby,它似乎与 ruby 相比与框架本身有更多的关系。
标签: ruby-on-rails ruby