2014-06-16 14 views
24

Ho un certo modulo che viene utilizzato in un Rails 4.1.1 applicazioneImpossibile definire più 'incluso' blocchi per una preoccupazione (ActiveSupport :: :: La preoccupazione MultipleIncludedBlocks) con cache_classes = true

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

quali è incluso in una classe

class Some 
    include A 
end 

Questa grande opera con cache_classes=true in application.rb. Ora, se spengo il caching delle classi, ottengo l'eccezione Cannot define multiple 'included' blocks for a Concern (ActiveSupport::Concern::MultipleIncludedBlocks) iniziando il server.

Come si dovrebbe affrontare un problema di questo tipo dal momento che il ricaricamento delle classi viene eseguito da Rails?

risposta

37

Per chi percorre lo stesso muro da leggere, la soluzione a questo è di rispettare rigorosamente le regole di autoloading di Rails. Questo è

  1. Rimozione di tutte le richiedere/require_relative
  2. percorsi aggiuntivi necessari a Rails percorsi autoload
  3. file messi a posti giusti con i nomi giusti in modo da Rails può dedurre dove cercare codice per caricare.

Maggiori informazioni qui: https://github.com/rails/rails/issues/15767

+1

Grazie cercato di cacciare questo per un po '. Avevo refactored una lib in una preoccupazione e ho iniziato a ricevere questo errore –

+0

Per il progetto in cui sono attivo, il modulo era esplicitamente richiesto in un file (oltre a essere nel percorso di caricamento automatico). Abbiamo iniziato ad avere questo problema quando si utilizza Sidekiq. La soluzione stava rimuovendo chiamate esplicite al modulo. –

+1

Avevo anche un problema in cui uno dei miei moduli/nome del namespace terminava con un 's', e credo che non abbia funzionato bene con la pluralizzazione di Rails, come semplicemente rinominando il modulo in una forma singolare funzionante. Pietà –