2010-10-23 12 views
12

che sto aggiornando il mio Rails app per lavorare con Ruby 1.9 e continuo gli errori che incontrano in questo modo:Che cosa significa "i moduli anonimi non hanno un nome a cui fare riferimento" significa veramente?

Anonymous modules have no name to be referenced by 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:585:in `to_constant_name' 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:391:in `qualified_name_for' 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:104:in `rescue in const_missing' 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:94:in `const_missing' 
/home/foo/app/config/environment.rb:66:in `block in <top (required)>' 
etc. 

Google trova tutti i tipi di risultati per questo, ma ciascuno di essi appartiene ad una correzione specifico per una specifica gemma o app. Nessuno di loro spiega cosa significhi realmente il messaggio.

  • Che cos'è un "modulo anonimo"?
  • Da dove viene questo messaggio di errore? (L'interprete Ruby stesso?)
  • Cosa c'è di diverso in Ruby 1.9 che causa questo? (Rails 2.3.8 con Ruby 1.8.7 non lo incontra.)
  • Qual è il modo generale/corretto per correggere questo errore?

Linea 66 del environment.rb è la configurazione per super_exception_notifier (vecchia versione, 2.0.8):

ExceptionNotifier.configure_exception_notifier do |config| 
    config[:sender_address] = %("Foo" <[email protected]>) 
    config[:exception_recipients] = %w([email protected]) 
    config[:skip_local_notification] = false 
end 

Da quello che posso dire, ExceptionNotifier è indefinito, e ActiveSupport sta tentando di caricare magicamente esso, ma non riesce e quindi non riesce nuovamente a provare a stampare un messaggio di errore piacevole.

+0

controllare le collisioni di nome nei nomi metodo/modulo nell'app con le guide. gli errori oscuri si verificano spesso quando la roba del codice entra in collisione con AR. – glebm

risposta

6

Un modulo anonimo è un modulo che è dichiarato in questo modo:

Fred = Module.new do 
    def meth1 
    "hello" 
    end 
    def meth2 
    "bye" 
    end 
end 

invece che utilizzando la normale Module mod_name <block> sintassi. Poiché non hanno un nome modulo, non è possibile recuperare il nome del modulo. to_constant_name sta tentando di chiamare desc.name.blank? dove desc è un modulo anonimo (senza name).

Questo errore proviene dal modulo ActiveSupport, che potrebbe indicare un bug nella gemma active_support o potrebbe indicare che un'altra parte di codice utilizza ActiveSupport in modo errato. Il messaggio di errore da solo non fornisce informazioni sufficienti per identificare il colpevole (almeno per me, qualcuno con più esperienza sui rails potrebbe essere in grado di fornire ulteriori informazioni).

Senza conoscere il codice incriminato è anche difficile dire esattamente perché questo errore sta spuntando con 1.9 o cosa è necessario fare per risolverlo. Considerando che ci sono un sacco di gemme non mantenute e non mantenute che non sono state ancora aggiornate per 1.9, sospetterei che ActiveSupport non sia la fonte del problema. Aggiorna tutte le tue gemme che hanno versioni compatibili con 1.9 e poi prova a disabilitare le tue altre gemme una alla volta (se puoi) e vedi se ottieni ancora l'errore.

Se si fornisce un elenco delle altre gem che si stanno utilizzando, qualcun altro che potrebbe aver riscontrato l'errore prima potrebbe essere in grado di fornire alcuni dettagli.

3

Ciò può accadere se si tenta di sfruttare i contesti interni di classe e modulo di ActiveRecord nel modo sbagliato. Ho avuto questo errore ieri mentre lavoravo su una gemma che estende i profondi meccanismi interni di ActiveRecord. Sono finalmente riuscito a risolvere questo problema riprogettando il mio codice che sfrutta i contesti interni. Sarebbe interessante vedere le linee circostanti di environment.rb:66 per ulteriori analisi.

+0

Domande modificate per includere codice fallito. – ScottJ

0

Quando ho ricevuto questo errore, è stato a causa di un errore di ortografia durante la definizione di una classe. Se ricevi questo errore, potrebbe valere la pena esaminare il modulo e le definizioni di classe per errori di battitura.

+0

Un po 'tardi per la festa, lo so, ma le altre risposte (anche se informative) in realtà non offrono consigli su elementi specifici per iniziare a controllare. –

1

Ciò può accadere quando il nome della classe non corrisponde al nome del file, in mio caso si trattava di un file chiamato application.rb contaning classe ApplicationController . Rinominare il file in application_controller.rb ha risolto il problema.

Problemi correlati