tutorial rails gema current_user create confirmable ruby-on-rails ruby devise devise-confirmable

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.