1

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回追加されます。なぜこれが起こるのだろうか?特別な理由はありますか?

4

1 に答える 1

0

イニシャライザには、名前以外のいくつかの属性があります: コンテキスト、ブロックなどです。したがって、エンジンが Rails::Engine から継承されるたびに、Rails::Engine のすべてのイニシャライザが異なるコンテキストを持つ子エンジンに追加されます。つまり、Rails::Application には同じ名前の重複する初期化子がありますが、それらは実際には異なるコンテキストで実行される異なる初期化子です。

def run(*args)                         
  @context.instance_exec(*args, &block)
end 
于 2013-03-21T09:40:33.803 に答える