web-dev-qa-db-ja.com

cache_classes = trueの懸念事項(ActiveSupport :: Concern :: MultipleIncludedBlocks)に対して複数の 'included'ブロックを定義することはできません

Rails 4.1.1アプリケーションで使用される特定のモジュールがあります

_module A
   extend ActiveSupport::Concern
   included do
     #Some code
   end
end
_

クラスに含まれています

_class Some
  include A
end
_

これは_cache_classes=true_の_application.rb_でうまく機能します。ここで、クラスのキャッシュをオフにすると、サーバーの起動時にCannot define multiple 'included' blocks for a Concern (ActiveSupport::Concern::MultipleIncludedBlocks)例外が発生します。

クラスのリロードはRailsによって行われるので、このような問題にどのように対処する必要がありますか?

32
muichkine

読むために同じ壁にぶつかる人にとって、これに対する解決策は厳密にRails autoloading rulesを尊重することです。つまり、

  1. すべてのrequire/require_relativeを削除する
  2. 必要なパスをRails autoload pathsに追加します
  3. Railsがロードするコードを探す場所を推測できるように、ファイルを正しい名前で正しい場所に配置します。

詳細はこちら: https://github.com/Rails/rails/issues/15767

49
muichkine

同じ名前の2つの懸念がある可能性もあります。

私の場合、Rails swagger:docs SD_LOG_LEVEL=1の実行中にこのエラーに直面しました。

$ Rails swagger:docs SD_LOG_LEVEL=1

Cannot define multiple 'included' blocks for a Concern
1.0: 19 processed / 49 skipped

同じ名前の2つのswaggerファイルがあったので。

module SwaggerDocs::TrackerPhases
  extend ActiveSupport::Concern
  included do
  end
end

module SwaggerDocs::TrackerPhases
  extend ActiveSupport::Concern
  included do
  end
end

2番目のファイルの名前を次のように変更しました。

module SwaggerDocs::ClientTrackerPhases
  extend ActiveSupport::Concern
  included do
  end
end 
1