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)
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のソースはこちら
その親の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なのか