ruby on rails - rails - Diseñar con confirmable: redirige al usuario a una página personalizada cuando los usuarios intentan iniciar sesión con un correo electrónico no confirmado
rails devise confirmable email (3)
Con el módulo Confirmable habilitado, Devise no permitirá que un usuario no confirmado inicie sesión después de que haya transcurrido un período de tiempo predefinido. En cambio, el usuario es redirigido de regreso a la página de inicio de sesión con el mensaje flash "Debe confirmar su cuenta antes de continuar".
Este es un modelo de interacción indeseable, ya que un aviso flash no proporciona el espacio adecuado para explicar al usuario por qué se ha denegado el acceso, qué significa "confirmar su cuenta", proporcionar un enlace para volver a enviar la confirmación e instrucciones sobre cómo verificarlo su carpeta de spam, etc.
¿Hay alguna forma en que pueda cambiar este comportamiento para redireccionar a una URL específica en su lugar?
Esta es mi solución que necesita agregar: mensaje no confirmado en las configuraciones locales debajo de las sesiones.
en la aplicación / controladores / sessions_controller.rb
def check_user_confirmation
user = User.where(email: params[:user][:email]).take
unless user && user.confirmed?
set_flash_message! :alert, :unconfirmed
expire_data_after_sign_in!
respond_with user, location: after_inactive_sign_up_path_for(user)
end
end
protected
def after_inactive_sign_up_path_for(resource)
new_user_session_path
end
Lo siento al principio, pensé que querías decir después de Registrarse, no iniciar sesión. Así que abajo funciona para cómo dirigir a los usuarios después de Registrarse y lo que debe hacer para iniciar sesión es crear una aplicación Devise :: FailureApp personalizada.
Consulte la página wiki: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated
Luego, dentro de su método personalizado de sobreescritura FailureApp redirect_url
desde https://github.com/plataformatec/devise/blob/master/lib/devise/failure_app.rb :
def redirect_url
if warden_message == :unconfirmed
custom_redirect_path
else
super
end
end
Para una redirección personalizada después de Registrarse:
Existe un método de controlador after_inactive_sign_up_path_for
dentro de RegistrosController que puede sobrescribir para lograr esto.
Primero en sus Rutas necesitará especificar para usar su controlador personalizado:
config/routes.rb
:
devise_for :users, :controllers => { :registrations => "users/registrations" }
En segundo lugar, crea su controlador personalizado que hereda del controlador normal para sobrescribir el método:
app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
protected
def after_inactive_sign_up_path_for(resource)
signed_up_path
end
end
En este caso, para mi aplicación, mi modelo de Devise es Usuario, por lo que es posible que desee cambiar ese espacio de nombres si su modelo tiene un nombre diferente. Quería que mis usuarios fueran redireccionados a la signed_up_path
, pero puede cambiarla a la ruta deseada.
Simplemente hice esto, pero tomé un enfoque diferente.
en app / controllers / sessions_controller.rb:
class SessionsController < Devise::SessionsController
before_filter :check_user_confirmation, only: :create
#
# other code here not relevant to the example
#
private
def check_user_confirmation
user = User.find_by_email(params[:email])
redirect_to new_confirmation_path(:user) unless user && user.confirmed?
end
end
Esto funcionó para mí y me pareció mínimamente invasivo. En mi aplicación, las nuevas sesiones siempre tienen que pasar por sessions#create
y los usuarios siempre inician sesión con su dirección de correo electrónico, por lo que este puede ser un caso más simple que el tuyo.
Por supuesto, puede redirect_to
cualquier ubicación que desee en el método check_user_confirmation
. new_confirmation_path
fue la elección lógica para mí, ya que proporciona a los usuarios los recursos para obtener la confirmación.