我们在application.rb中会使用config 进行如下类似的设置
config.i18n.default_locale = 'zh-CN' # Configure the default encoding used in templates for Ruby 1.9. config.encoding = "utf-8" # Configure sensitive parameters which will be filtered from the log file. config.filter_parameters += [:password]
而且在很多的railtie, engine中也又这样的设置,如activerecord, action_controller中都有,为什么这些config是全局共享的呢?
其实,各个railtie/engine/application 中的config都是一个Configuration实例(Railtie::Configuration, Engine::Configuration, Application::Configuration)
但是config实例有一个共享的类变量@@options,而且通过method_missing的方式将config的设置选项设置到@@options中,这样所有的config实例间都共享,而各自的config还可以拥有自己的设置
下面是主要的代码:
module Rails class Railtie class Configuration def initialize @@options ||= {} end private def method_missing(name, *args, &blk) if name.to_s =~ /=$/ @@options[$`.to_sym] = args.first elsif @@options.key?(name) @@options[name] else super end end end end end