Подтвердить что ты не робот

Придумать с помощью Подтверждения - перенаправить пользователя на пользовательскую страницу, когда пользователи пытаются войти с неподтвержденным письмом

При включенном модуле Подтверждение, Devise не позволит неподтвержденному пользователю войти в систему после истечения предопределенного периода времени. Вместо этого пользователь перенаправляется обратно на страницу входа с флэш-сообщением "Перед тем, как продолжить", вы должны подтвердить свою учетную запись.

Это нежелательная модель взаимодействия, так как флеш-уведомление не предоставляет достаточного пространства для правильного объяснения пользователю, почему было отказано в доступе, что означает "подтвердить вашу учетную запись", предоставить ссылку для повторной отправки подтверждения и инструкции по как проверить папку со спамом и т.д.

Можно ли изменить это поведение для перенаправления на определенный URL?

4b9b3361

Ответ 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