第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.runinitializer.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