Rails::Initializer.runは2回(以上)実行されている?

久々に読んでます。

なんかRailsの起動処理に誤解があったみたいです。 Rails::Initializer.runは1度しか実行されないと思ってたけど、そうじゃないみたい。

とりあえずRails::Initializer.runが2回実行される流れをまとめてみよう。

+environment.rbが読み込まれる ++boot.rbが読み込まれる +++Rails.boot!が実行される ++++Boot.runが実行される +++++Rails::Initializer.run(:set_load_path) ++Rails::Initializer.run do |config|; end

つまり一度boot.rbの中で

Rails::Initializer.run(:set_load_path)

が実行され、ロードパスが定義された後

もう一度

Rails::Initializer.run do |config|
end

今度は引数無しのブロッグ付きで呼び出される。 ブロック付きで渡されると

def self.run(command = :process, configuration = Configuration.new)
  yield configuration if block_given?
  initializer = new configuration
  initializer.send(command)
  initializer
end

Configurationのインスタンスに対して、カスタムされた設定が上書きされた上で processメソッドが走る。

うーん、深いな・・・。

Railsを実行する環境によって(テスト、開発、本番など)設定をうまく切り替えられる目的なわけですが、 結構複雑だなぁ。しかしよくできている。

次回は2回目のrun時に呼ばれるprocessメソッド内を見て行く。 ここは粛々と内部の初期化メソッドが呼ばれているだけみたいだから、時間をかければ読み切れると思う。

最近はてなダイアリーに引っ越そうかななんて思ってます。 はてな記法が便利だし、ソースを貼付けやすいから。

関連記事

  1. 毎日読むRails initializer.rb #02
  2. 毎日読むRails environment.rb その2
  3. 毎日読むRails boot.rb その3
  4. 毎日読むRails boot.rb その2
  5. 毎日読むRails boot.rb その1
Posted in code reading, ruby, ruby on rails at 2月 22nd, 2008. Trackback URI: trackback

No Responses to “Rails::Initializer.runは2回(以上)実行されている?”

Leave a Reply