2 月 22 2008

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

Published by haga at 1:01 under code reading, ruby, ruby on rails

久々に読んでます。

なんか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メソッド内を見て行く。 ここは粛々と内部の初期化メソッドが呼ばれているだけみたいだから、時間をかければ読み切れると思う。

--

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

Trackback URI | Comments RSS

Leave a Reply