Estoy usando Devise en una aplicación Rails 3, pero en este caso, un usuario debe ser creado por un usuario existente, que determina qué permisos tendrá.
Debido a esto, quiero:
- Para eliminar la ruta para que los usuarios se registren .
- Para seguir permitiendo a los usuarios editar sus perfiles (cambiar la dirección de correo electrónico y la contraseña) después de haberse registrado
¿Cómo puedo hacer esto?
Actualmente, estoy eliminando efectivamente esta ruta colocando lo siguiente antes devise_for :users:
match 'users/sign_up' => redirect('/404.html')
Eso funciona, pero me imagino que hay una mejor manera, ¿verdad?
Actualizar
Como dijo Benoit Garret, la mejor solución en mi caso es omitir la creación de las rutas de registros en masa y simplemente crear las que realmente quiero.
Para hacer eso, primero corrí rake routes, luego usé el resultado para volver a crear los que quería. El resultado final fue este:
devise_for :users, :skip => [:registrations]
as :user do
get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
put 'users' => 'devise/registrations#update', :as => 'user_registration'
end
Tenga en cuenta que:
- Todavia tengo
:registerableen miUsermodelo devise/registrationsmaneja la actualización de correo electrónico y contraseña- La actualización de otros atributos de usuario (permisos, etc.) es manejada por un controlador diferente
Respuesta real:
Elimine la ruta para los caminos de diseño predeterminados; es decir:
devise_for :users, path_names: {
sign_up: ''
}
ruby-on-rails-3
routing
devise
Nathan Long
fuente
fuente

https://example.com/users/. Vea mi respuesta a continuación.Respuestas:
Traté de hacer esto también, pero un hilo en el ingenioso grupo de Google me disuadió de buscar una solución realmente limpia.
Citaré a José Valim (el encargado del diseño):
La pregunta original fue:
fuente
:skip => :registrationsno:skip => :registerable.puedes hacer esto en tu modelo
cámbielo a:
observe que el símbolo
:registerablefue eliminadoEso es todo, no se requiere nada más. Todas las rutas y enlaces a la página de registro también se eliminan mágicamente.
fuente
edit_user_registrationque necesito. Como dije, "aún deberían poder editar sus perfiles".localhost:3000/admindonde pueden editar su cuenta, incluso con el objeto resistente eliminado. Si esa no es una solución viable, eche un vistazo a CanCan, que le permite estipular quién puede y quién no puede acceder a un recurso. Tiendo a agregar roles como 'admin' o 'moderador' y bloquear a todos los demás fuera de las páginas de registro.sign_inen producción?Tuve un problema similar al intentar eliminar las rutas de devise_invitable para crear y nuevas :
antes de:
rutas de rastrillo
después
rutas de rastrillo
nota 1 idear alcance https://github.com/plataformatec/devise#configuring-routes
nota 2 Lo estoy aplicando en devise_invitable pero funcionará con cualquier función de * ideable
Nota importante: ¿ ve que devise_scope está en el usuario, no en los usuarios ? eso es correcto, ¡cuidado con esto! Puede causar mucho dolor al causarle este problema:
fuente
Encontré otra publicación similar a esta y quería compartir una respuesta que @chrisnicola dio. En la publicación, intentaban bloquear solo los registros de usuarios durante la producción.
También puede modificar el controlador de registros. Puedes usar algo como esto:
En "app / controllers / registrations_controller.rb"
Esto anulará el controlador del dispositivo y utilizará los métodos anteriores en su lugar. Agregaron mensajes flash en caso de que alguien de alguna manera llegara a la página de registro. También debe poder cambiar la redirección a cualquier ruta que desee.
También en "config / routes.rb" puede agregar esto:
Dejarlo así le permitirá utilizar el dispositivo estándar para editar su perfil. Si lo desea, puede anular la opción de editar perfil incluyendo
en "app / controllers / registrations_controller.rb"
fuente
Esta es una vieja pregunta, pero recientemente tuve que resolver el mismo problema y se me ocurrió una solución que es mucho más elegante que:
Y proporciona los nombres predeterminados para las rutas nombradas (como
cancel_user_registration) sin ser excesivamente detallado.rake routessalida con los módulos de diseño predeterminados:fuente
Puede anular el "devise_scope" colocándolo antes del "devise_for".
No estoy seguro de si esta es la mejor manera, pero es mi solución actualmente, ya que solo redirige a la página de inicio de sesión.
fuente
/users/sign_upentonces tendrá acceso a la dirección perosites#indexnosign_upse mantendrá/users/sign_up.Me gustó la respuesta de @ max , pero cuando traté de usarla me encontré con un error debido a que
devise_mappingera nula.Modifiqué su solución ligeramente a una que parece abordar el problema. Se requiere envolver la llamada al
resourceinteriordevise_scope.Tenga en cuenta que
devise_scopeespera el singular:usermientras queresourceespera el plural:users.fuente
Haga esto en routes.rb
obtendrá un error ahora mientras viene a la página de inicio de sesión, para solucionarlo. Haga este cambio en: app / views / devise / shared / _links.erb
fuente
devise_fory elasbloque) y tuve que eliminarlo:registerableen el modelo.He encontrado que esto funciona bien sin alterar las rutas o agregar métodos de controlador de aplicaciones. Mi enfoque es anular el método de diseño. Agregue esto a
app/controllers/devise/registrations_controller.rbHe omitido los otros métodos por brevedad.También para eliminar la ilusión de que esta ruta aún es accesible desde otras vistas, es posible que también desee eliminar este código de
app/views/devise/shared/_links.erbfuente
Para otros en mi caso.
Con
devise (3.5.2).Eliminé con éxito las rutas para registrarme, pero guardé las para editar el perfil, con el siguiente código.
fuente
Aquí está la ruta ligeramente diferente que fui. Lo hace para que no tenga que anular el
devise/shared/_links.html.erbvista.En
app/models/user.rb:En
config/routes.rb:Antes de:
Después:
fuente
devise_for :users, skip: :allTuve el mismo problema y me pareció una mala práctica redirigir a los usuarios desde la página de registro. Entonces, mi solución es básicamente no usar
:registrablenada.Lo que hice fue crear una página similar, como editar detalles del usuario, que se veía así:
Por lo tanto, este formulario se envía a un nuevo punto final de publicación que actualiza la contraseña, que se ve así:
Más adelante, puede usar el
@resulten su vista para decirle al usuario si la contraseña se actualiza o no.fuente
Al cambiar las rutas, hay muchos otros problemas que vienen con eso. El método más fácil que he encontrado es hacer lo siguiente.
fuente
Podrías modificar la
devisegema misma. Primero, ejecute este comando para encontrar la ubicación instalada de uso:gem which deviseSupongamos que el camino es:
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/deviseLuego ve a
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise/lib/devise/railsy editarroutes.rben ese directorio. Hay un método llamadodef devise_registration(mapping, controllers)que puede modificar para deshacerse de la nueva acción. También puede eliminar completamente las asignaciones paradevise_registrationfuente
gem 'devise', github: 'yourusername/devise', branch: "master")