Questo è probabilmente causato dal caricatore automatico delle guide. Nel fare questo:
module Foo
class Bar
end
end
e poi cercando di utilizzare Foo::Bar
, il caricatore automatico prima tenta di individuare app/models/foo/bar.rb
. Il file viene caricato e qui viene definito module Foo
(anche se come modulo contenente esclusivamente Bar
) in modo che il caricatore automatico non tenti mai di caricare app/models/foo.rb
.
Questo dovrebbe accadere solo in modalità sviluppo, come in modalità di produzione tutti i file sono require
all'avvio.
ci sono due soluzioni: AFAIK
ingannare il caricatore automatico
dichiarare la classe utilizzando class Foo::Bar
, per costringere il caricatore automatico per risolvere una ricerca costante per Foo
.
Questo ha l'effetto collaterale fastidioso che la ricerca costante all'interno Bar
NON verrà ambito all'interno Foo
, per esempio:
# app/models/foo.rb
module Foo
BAZ = "baz"
end
# app/models/foo/bar.rb
class Foo::Bar
def baz
BAZ
end
end
qui, Foo::Bar.new.baz
falliranno, a meno che non si fa riferimento alla costante utilizzando Foo::BAZ
. Questo può davvero creare confusione quando si definiscono le associazioni ActiveRecord, ad esempio.
necessario il modulo
utilizzando require_dependency
:
require_dependency 'foo'
module Foo
class Bar
end
end
Questa è secondo me la soluzione giusta, in quanto non si rompe la ricerca costante, ma è anche un po 'fastidioso come si deve aggiungi la dichiarazione require in cima a ogni file dello spazio dei nomi.
Nota:
Questo bug sembra essere stato risolto in rotaie 4. Ho usato la seconda soluzione molto mentre su rotaie 3, ma ho cercato di riprodurre il bug in rotaie 4 e lo fa non si presenta più. Penso che abbiano modificato il modo in cui funziona il caricatore automatico. Per ulteriori informazioni, vedere the rails guides on autoloading and reloading constants
Quale versione di Rails stai usando? – qerub
Come menzionato da Qerub, dovresti controllare la versione di Rails, perché se non sbaglio, questa funzione è arrivata da 3.0 – zsquare
I'am using Rails 3.2 – gorootde