rails initialize 中的config

我们在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
原文地址:https://www.cnblogs.com/kamechen/p/2501022.html