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
:registerable
en miUser
modelo devise/registrations
maneja 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 => :registrations
no:skip => :registerable
.puedes hacer esto en tu modelo
cámbielo a:
observe que el símbolo
:registerable
fue 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_registration
que necesito. Como dije, "aún deberían poder editar sus perfiles".localhost:3000/admin
donde 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_in
en 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 routes
salida 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_up
entonces tendrá acceso a la dirección perosites#index
nosign_up
se mantendrá/users/sign_up
.Me gustó la respuesta de @ max , pero cuando traté de usarla me encontré con un error debido a que
devise_mapping
era nula.Modifiqué su solución ligeramente a una que parece abordar el problema. Se requiere envolver la llamada al
resource
interiordevise_scope
.Tenga en cuenta que
devise_scope
espera el singular:user
mientras queresource
espera 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_for
y elas
bloque) y tuve que eliminarlo:registerable
en 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.rb
He 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.erb
fuente
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.erb
vista.En
app/models/user.rb
:En
config/routes.rb
:Antes de:
Después:
fuente
devise_for :users, skip: :all
Tuve 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
:registrable
nada.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
@result
en 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
devise
gema misma. Primero, ejecute este comando para encontrar la ubicación instalada de uso:gem which devise
Supongamos que el camino es:
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise
Luego ve a
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise/lib/devise/rails
y editarroutes.rb
en 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_registration
fuente
gem 'devise', github: 'yourusername/devise', branch: "master"
)