La magia de la carga automática
Creo que la opción que controla las carpetas desde las que se realiza la carga automática se ha cubierto suficientemente en otras respuestas. Sin embargo, en caso de que alguien más tenga problemas cargándose aunque hayan modificado sus rutas de carga automática según sea necesario, esta respuesta intenta explicar cuál es la magia detrás de esta carga automática.
Entonces, cuando se trata de cargar cosas desde subdirectorios, hay una trampa o una convención que debes tener en cuenta. A veces, la magia Ruby / Rails (esta vez principalmente Rails) puede dificultar la comprensión de por qué sucede algo. Cualquier módulo declarado en las rutas de carga automática solo se cargará si el nombre del módulo corresponde al nombre del directorio principal. Entonces, en caso de que intentes poner lib/my_stuff/bar.rb
algo como:
module Foo
class Bar
end
end
No se cargará automáticamente. Por otra parte, si cambia el nombre del directorio padre de foo
alojamiento tanto en el módulo de ruta: lib/foo/bar.rb
. Estará allí para ti. Otra opción es nombrar el archivo que desea cargar automáticamente con el nombre del módulo. Obviamente, solo puede haber un archivo con ese nombre. En caso de que necesite dividir sus cosas en muchos archivos, por supuesto, puede usar ese archivo para requerir otros archivos, pero no lo recomiendo, porque cuando esté en modo de desarrollo y modifique esos otros archivos, Rails no podrá automaticamente Vuelva a cargarlos para usted. Pero si realmente lo desea, podría tener un archivo con el nombre del módulo que luego especifique los archivos reales necesarios para usar el módulo. Por lo tanto, podría tener dos archivos: lib/my_stuff/bar.rb
y lib/my_stuff/foo.rb
el primero es el mismo que el anterior y el último contiene una sola línea:require "bar"
y eso funcionaría igual
PD: Me siento obligado a agregar una cosa más importante. Últimamente, cada vez que quiero tener algo en el directorio lib que necesita cargarse automáticamente, tiendo a empezar a pensar que si esto es algo que realmente estoy desarrollando específicamente para este proyecto (que suele ser, algún día podría se convierta en un fragmento de código "estático" utilizado en muchos proyectos o en un submódulo git, etc. en cuyo caso definitivamente debería estar en la carpeta lib), entonces tal vez su lugar no esté en la carpeta lib en absoluto. Quizás debería estar en una subcarpeta debajo de la carpeta de la aplicación · Tengo la sensación de que esta es la nueva forma de hacer las cosas. Obviamente, la misma magia está en el trabajo en cualquier lugar en el que cargue automáticamente los caminos en los que coloque sus cosas, por lo que es bueno para estas cosas. De todos modos, esto es solo mis pensamientos sobre el tema. Eres libre de estar en desacuerdo. :)
ACTUALIZACIÓN: Sobre el tipo de magia ...
Como severin señaló en su comentario, el núcleo "mecanismo de carga automática de un módulo" es parte de Ruby, pero las cosas de las rutas de carga automática no lo son. No necesitas rieles para hacerautoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")
. Y cuando intentes hacer referencia al módulo Foo por primera vez, se cargará por ti. Sin embargo, lo que hace Rails es que nos brinda una forma de intentar cargar cosas automáticamente desde carpetas registradas y esto se ha implementado de tal manera que debe asumir algo sobre las convenciones de nomenclatura. Si no se hubiera implementado así, cada vez que haga referencia a algo que no está cargado actualmente, tendría que revisar todos los archivos en todas las carpetas de carga automática y verificar si alguno de ellos contiene lo que estaba tratando de hacer referencia. Esto a su vez derrotaría la idea de la carga automática y la recarga automática. Sin embargo, con estas convenciones en su lugar, puede deducir del módulo / clase su intento de cargar donde se podría definir y simplemente cargar eso.
app/lib
.