Esto es probablemente causado por el autocargador de carriles. Al hacer esto:
module Foo
class Bar
end
end
y luego tratar de utilizar Foo::Bar
, el cargador automático intenta localizar app/models/foo/bar.rb
primero. El archivo está cargado y aquí se define module Foo
(aunque como un módulo que contiene únicamente Bar
) por lo que el autocargador nunca intenta cargar app/models/foo.rb
.
Esto solo debería ocurrir en el modo de desarrollo, ya que en el modo de producción todos sus archivos son require
'd al inicio.
Hay dos soluciones: Que yo sepa
engañar al cargador automático
declarar su clase utilizando class Foo::Bar
, para forzar el cargador automático para resolver una búsqueda constante para Foo
.
Esto tiene el efecto secundario molesto que la búsqueda constante en el interior Bar
NO será de ámbito dentro Foo
, por ejemplo:
# app/models/foo.rb
module Foo
BAZ = "baz"
end
# app/models/foo/bar.rb
class Foo::Bar
def baz
BAZ
end
end
aquí, Foo::Bar.new.baz
se producirá un error, a menos que se hace referencia a la constante usando Foo::BAZ
. Esto puede ser realmente un desastre al definir asociaciones ActiveRecord, por ejemplo.
Exigir el módulo
usando require_dependency
:
require_dependency 'foo'
module Foo
class Bar
end
end
Esta es mi humilde opinión la solución adecuada, ya que no se rompa la búsqueda constante, pero también es un poco molesto, ya que tiene que agregue la instrucción require en la parte superior de cada archivo de espacio de nombres.
Nota:
Este error parece haber sido resuelto en los carriles 4. He utilizado la segunda solución mucho mientras que en los carriles 3, pero he tratado de reproducir el error en los carriles 4 y lo hace no aparecer más Creo que modificaron la forma en que funciona el autocargador ... Para obtener más información, consulte the rails guides on autoloading and reloading constants
¿Qué versión de Rails está usando? – qerub
Como mencionó Qerub, debe verificar su versión de Rails, porque si no me equivoco, esta característica vino de 3.0 – zsquare
Estoy usando Rails 3.2 – gorootde