DesignAssembler

備忘録に近い

configとは何者か

Railsのconfig/application.rbにあるconfigが何者か分からなかったので調べました。

config.autload_paths << Rails.root.join('lib/MyLib')とかで使われますよね。

require 'rails/all'

module WhatIsConfig
  class Application < Rails::Application
    config.title = "asdf"
  end
end

> WhatIsConfig::Application.config.title
"asdf"
> WhatIsConfig::Application.config.class
Rails::Application::Configuration < Rails::Engine::Configuration

configの正体はRails::Application::Configurationのインスタンスのようです。

configはrailsの初期変数で、Rails::Applicationで宣言されています。(L120:L121)

github.com

INITIAL_VARIABLES = [:config, :railties, :routes_reloader, :reloaders,
                         :routes, :helpers, :app_env_config, :secrets]

そして、L361:L363で作られています。

    def config #:nodoc:
      @config ||= Application::Configuration.new(self.class.find_root(self.class.called_from))
    end

Rails::Engine::Configurationのソースはこちら

github.com

その親のRails::Application::Configurationのソースはこちら github.com

さらにその親の::Rails::Engine::Configurationはこちら github.com

さらにさらにその親の::Rails::Railtie::Configurationはこちら github.com

上の例のような自分で定義した変数の呼び出しはmethod_missingで拾っているみたいですね(::Rails::Railtie::ConfigurationのL89:L97)

      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

掴みにくい・・・

これは本当にDRYなのか

参考

設定ファイル(config) - - Railsドキュメント