¿Sería posible tener algo como esto?
app/models/
app/models/users/user.rb
app/models/users/education.rb
El objetivo es organizar mejor la carpeta / app / models , pero sin tener que asignar espacios de nombres a los modelos.
Una pregunta sin respuesta para Rails 3 está aquí: Rails 3.2.9 y modelos en subcarpetas .
La especificación de table_name con espacios de nombres parece funcionar (consulte la subcarpeta del modelo Rails 4 ), pero quiero hacer esto sin un espacio de nombres .
ruby-on-rails
namespaces
ruby-on-rails-4
models
subdirectory
Rubytastic
fuente
fuente
Respuestas:
De forma predeterminada, Rails no agrega subcarpetas del directorio de modelos a la ruta de carga automática. Es por eso que solo puede encontrar modelos con espacios de nombres: el espacio de nombres ilumina el subdirectorio para buscar.
Para agregar todas las subcarpetas de aplicaciones / modelos a la ruta de carga automática, agregue lo siguiente a config / application.rb :
config.autoload_paths += Dir[Rails.root.join("app", "models", "{*/}")]
O, si tiene un directorio de aplicaciones / modelos más complejo , es posible que el método anterior de agrupar todas las subcarpetas de aplicaciones / modelos no funcione correctamente. En cuyo caso, puede evitar esto siendo un poco más explícito y solo agregando las subcarpetas que especifique:
config.autoload_paths += Rails.root.join("app", "models", "<my_subfolder_name1>") config.autoload_paths += Rails.root.join("app", "models", "<my_subfolder_name2>")
ACTUALIZAR para Rails 4.1+
A partir de Rails 4.1, el generador de aplicaciones no incluye
config.autoload_paths
de forma predeterminada. Entonces, tenga en cuenta que lo anterior realmente pertenece a config / application.rb .ACTUALIZAR
Se corrigieron los ejemplos de ruta de carga automática en el código anterior para usar en
{*/}
lugar de{**}
. Asegúrese de leer el comentario de muichkine para obtener detalles sobre esto.fuente
app/models/user/credits.rb
entonces asegúrese de que el nombre de la clase en el archivo también es plural:class Credits
. Pero, recomendaría usar el estándar Rails y hacer queclass Credit
el nombre del archivo seaapp/models/user/credit.rb
(los modelos deben ser en singular). De cualquier manera, este debería ser el problema. ¡Házmelo saber!config.autoload_paths += %W( #{Rails.root}/app/models/namespace #{Rails.root}/app/models/other_namespace )
config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]
funciona pero ralentiza la aplicación, especialmente en el modo de desarrollo donde la aplicación se recarga con frecuencia. La razón es que no debe agregar todos los archivos a autoload_paths, sino solo las carpetas raíz de donde se pueden inferir los nombres de archivo y los módulos. En términos simples, si solo tiene un nivel de subcarpetas en modelos y no hay modelos de espacio de nombres, solo debe hacer loconfig.autoload_paths += Dir[Rails.root.join('app', 'models', '*/')]
que agrega solo el primer nivel de subdirectorios. Lo mismo paralib
u otros caminos.auto_loading_paths
que agrega la inferencia para el modelo. Por ejemplo, si lo tieneNameSpace::Model
, intentará encontrar en todos los autoloading_paths unpath/namespace/model
. Obviamente, esto solo puede coincidir cuandopath
es un directorio. Como regla general, solo debe tener directorios en elautoload_paths
para una máxima eficiencia. Espero eso ayude.