web-dev-qa-db-fra.com

Impossible de définir plusieurs blocs «inclus» pour une préoccupation (ActiveSupport :: Concern :: MultipleIncludedBlocks) avec cache_classes = true

J'ai un certain module qui est utilisé dans une application Rails 4.1.1

module A
   extend ActiveSupport::Concern
   included do
     #Some code
   end
end

qui est inclus dans une classe

class Some
  include A
end

Cela fonctionne très bien avec cache_classes=true Dans application.rb. Maintenant, si je désactive la mise en cache des classes, j'obtiens Cannot define multiple 'included' blocks for a Concern (ActiveSupport::Concern::MultipleIncludedBlocks) exception upson lors du démarrage du serveur.

Comment traiter un tel problème puisque le rechargement des classes se fait par Rails?

32
muichkine

Pour quiconque frappe le même mur à lire, la solution est de respecter strictement les règles de Rails autoloading.

  1. Suppression de tous les require/require_relative
  2. Ajouter les chemins nécessaires à Rails chemins de chargement automatique
  3. Placez les fichiers aux bons endroits avec les bons noms afin que Rails puisse déduire où chercher le code à charger.

Plus d'informations ici: https://github.com/Rails/rails/issues/15767

49
muichkine

Il est également possible que vous ayez deux problèmes avec le même nom.

Dans mon cas, j'ai rencontré cette erreur lors de l'exécution de 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

Depuis que j'avais deux fichiers swagger du même nom.

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

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

J'ai renommé le deuxième fichier comme:

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