Rails 3の初期化プロセスを進めていたところ、Rails :: Engine(10個あります)で定義されたすべての初期化子がRails::Applicationインスタンスに複数回追加されていることがわかりました。これは、これらの初期化子が何度も実行されることを意味します。分析は次のとおりです。1。Rails::Application#initializers:
def initializers #:nodoc:
Bootstrap.initializers_for(self) +
super +
Finisher.initializers_for(self)
end
次のように定義されているsuper(Rails :: Engine)メソッドを呼び出します。
def initializers
initializers = []
ordered_railties.each do |r|
if r == self
initializers += super
else
initializers += r.initializers
end
end
initializers
end
Rails :: Engine#initializersから、すべてのエンジン(Rails :: Engineから継承したクラス)が、Rails::Applicationを含むRails::Engineの初期化子をそのエンジンに追加することがわかります。ただし、他のすべてのエンジンはRails :: Applicationのordered_railtiesに含まれているため、それらの初期化子もRails::Applicationの初期化子に追加されます。Rails::EngineのイニシャライザーはRails::Applicationに何度も追加されていると結論付けることができます。コンソール情報から確認できます。
1.9.3p194 :002 > Rails.application.initializers.map(&:name).size
=> 119
1.9.3p194 :001 > Rails.application.initializers.map(&:name).uniq.size
=> 79
したがって、Rails::Engineのすべての初期化子はRails::Applicationの初期化子に5回追加されます。なぜこれが起こるのだろうか?特別な理由はありますか?