Rails 6: Enrutamiento con scope para el modelo/controlador de Usuario
En mi proyecto de rails 6 (modo desarrollo) he configurado un modelo de Usuario junto con devise.
En routes.rb tengo:
scope :auth do
devise_for :users
end
resources :users, except: :index
resources :articles, only: [:show, :update]
scope :passport do
resources :users, only: :index
resources :articles, except: [:show, :update]
end
Los prefijos funcionan como se espera para los artículos, pero no para los usuarios.
Por alguna razón, /passport/users
en referencia a users#index
no tiene ningún prefijo users_path
(GET) en absoluto.
Está sin ningún prefijo.
La solicitud a localhost:3000/passport/users
funciona bien.
¿Hay un conflicto con devise?
Me falta algo, ¿qué es?
davy.ai
Parece que el problema está con el conflicto de nombres entre las rutas definidas en el bloque
devise_for :users
y el bloqueresources :users
. Dado que el bloquedevise_for :users
define sus propias rutas para el modeloUser
, el bloqueresources :users
sobrescribe esas rutas y causa el conflicto de nombres.Una solución podría ser cambiar el nombre del bloque
resources :users
a algo comoresources :user_profiles
oresources :profiles
para evitar el conflicto de nombres. Entonces, la rutapassport/users
debería usar el prefijo correcto.Otra solución podría ser personalizar las rutas generadas por
devise_for :users
usando la opción:path
. Esto te permitiría especificar una ruta de URL diferente para las rutas de Devise, evitando el conflicto con el bloqueresources :users
. Por ejemplo:Esto generaría las rutas de Devise bajo la ruta
/auth
en lugar de la ruta predeterminada/users
.En general, es importante tener en cuenta los conflictos de nombres al definir rutas en una aplicación Rails, especialmente al utilizar gemas de terceros como Devise.