En Rails, ¿es posible crear espacios de nombres en módulos y aún así obtener el comportamiento correcto de url_for
?Rails url_for y namespaced models
Por ejemplo, aquí, url_for
funciona como se espera:
# app/models/user.rb
class User < ActiveRecord::Base
end
# config/routes.rb
resources :users
# app/views/users/index.html.haml
= url_for(@user) # /users/1
Mientras que después de poner el modelo User
en un módulo, url_for
se queja de un método no definido m_user_path
:
# app/models/m/user.rb
module M
class User < ActiveRecord::Base
end
end
# config/routes.rb
resources :users
# app/views/users/index.html.haml
= url_for(@user) # undefined method 'm_users_path'
¿Es posible tener url_for
ignorar el módulo en M::User
y devolver user_path
para url_for(@user)
en lugar de m_user_path
?
ACTUALIZACIÓN
Así, después de casi 5 años, aquí está la solución, gracias a ESAD. Esto ha sido probado en Rails 4.2.
# app/models/m/user.rb
module M
class User < ActiveRecord::Base
end
end
# app/models/m.rb
module M
def self.use_relative_model_naming?
true
end
def self.table_name_prefix
'm_'
end
end
# config/routes.rb
resources :users
# app/views/users/index.html.haml
= url_for(@user) # /users/1
Nota: cuando se genera el modelo, vista y controlador con bin/rails g scaffold m/user
, serán de espacios de nombres de las vistas y el controlador, también. Debe mover app/views/m/users
a app/views/users
y app/controllers/m/users_controller.rb
a app/controllers/users_controller.rb
; también debe eliminar las referencias al módulo M
en todas partes, excepto en el modelo M::User
.
Finalmente, el objetivo aquí era para los modelos de espacio de nombres pero no para las vistas y los controladores. Con la solución de búsqueda, el módulo M
(que contiene User
) se le indica explícitamente que no aparezca en las rutas. Por lo tanto, de manera efectiva, se elimina el M
y solo queda User
.
El modelo de usuario ahora puede residir en app/views/models/m/user.rb
, el controlador de usuario vive en app/views/controllers/users_controller.rb
y las vistas se pueden encontrar en app/views/users
.
Esto es de oro! Resuelve exactamente lo que el OP estaba pidiendo (y lo que estaba buscando) Gracias – Ivar
¡Si pudiera poner más + 1 aquí !!!!! ¡Gracias! – eirc
¡Este método debería ser el primero documentado en la API de Rails! – olhor