Придумать с помощью Подтверждения - перенаправить пользователя на пользовательскую страницу, когда пользователи пытаются войти с неподтвержденным письмом
При включенном модуле Подтверждение, Devise не позволит неподтвержденному пользователю войти в систему после истечения предопределенного периода времени. Вместо этого пользователь перенаправляется обратно на страницу входа с флэш-сообщением "Перед тем, как продолжить", вы должны подтвердить свою учетную запись.
Это нежелательная модель взаимодействия, так как флеш-уведомление не предоставляет достаточного пространства для правильного объяснения пользователю, почему было отказано в доступе, что означает "подтвердить вашу учетную запись", предоставить ссылку для повторной отправки подтверждения и инструкции по как проверить папку со спамом и т.д.
Можно ли изменить это поведение для перенаправления на определенный URL?
Ответы
Ответ 1
Извините, сначала я думал, что вы имели в виду после регистрации, а не входа в систему. Итак, ниже описано, как направлять пользователей после регистрации, и что вам нужно сделать для входа в систему - это создать пользовательский Devise:: FailureApp
См. страницу wiki: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated
Затем внутри вашего пользовательского метода FailureApp перезапишите redirect_url
метод из 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
Для пользовательского перенаправления после регистрации:
Внутри RegistrationsController есть метод контроллера after_inactive_sign_up_path_for
, который вы можете перезаписать для выполнения этого.
Сначала в ваших Маршрутах вам нужно указать, использовать свой пользовательский контроллер:
config/routes.rb
:
devise_for :users, :controllers => { :registrations => "users/registrations" }
Во-вторых, вы создаете свой пользовательский контроллер, который наследуется от обычного контроллера, чтобы перезаписать метод:
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
В этом случае для моей модели приложения My Devise является User, поэтому вы можете захотеть изменить это пространство имен, если ваша модель названа по-разному. Я хотел, чтобы мои пользователи были перенаправлены на signed_up_path
, но вы можете изменить их на нужный путь.
Ответ 2
Я просто сделал это, но принял другой подход.
в приложении/контроллерах/session_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
Это работало для меня и казалось минимально инвазивным. В моем приложении новые сеансы всегда проходят через sessions#create
, и пользователи всегда регистрируются с их адресом электронной почты, так что это может быть более простой случай, чем ваш.
Вы можете, конечно, redirect_to
найти любое место в методе check_user_confirmation
. new_confirmation_path
был логичным выбором для меня, потому что он предоставляет пользователям ресурсы для подтверждения.
Ответ 3
Это мое решение, которое вам нужно добавить: неподтвержденное сообщение о разработке локалей ниже сеансов.
в приложении/контроллерах/session_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