第7回 config/initializers ディレクトリ
2008/02/27
Rails 2.0 以前は config/environments.rb にアプリケーション特有の初期化コードを書いたものですが、2.0 以後は config/initializers ディレクトリに置いたファイルが自動的に読み込まれるようになりました。
この仕組みはどんな風に作られているのでしょうか。
rails-2.0.2 ディレクトリで、文字列 'initializers' を含むファイルを検索すると、該当するソースコードはすぐに見つかります。initializer.rb です。Rails::Initializer#load_application_initializers が、問題のメソッドです。
def load_application_initializers
Dir["#{configuration.root_path}/config/initializers/**/*.rb"].sort.each do |initializer|
load(initializer)
end
end
Dir[pattern] は、pattern にマッチするパス名の配列を返します。それを sort して each で回しながら、一つずつ読み込んでいく、というわけです。ファイルの名前順に読み込まれることが分かります。
さて、このメソッドは Rails::Initializer#process メソッドの中から呼ばれています。
def process
check_ruby_version
# (省略)
load_application_initializers
end
更に遡ると、クラスメソッド Rails::Initializer.run の initializer.send(command) というコードにたどり着きます。
def self.run(command = :process, configuration = Configuration.new)
yield configuration if block_given?
initializer = new configuration
initializer.send(command)
initializer
end
変数 command の中身は :process というシンボルなので、initializer.process を実行しているのと同じことです。
では、Rails::Initializer.run はどこから呼ばれているのでしょうか。そう、それはあなたのアプリケーションの config/environment.rb の中です。
Rails::Initializer.run do |config| # (省略) end
