Как перенаправить неподтвержденных пользователей, используя Ruby on Rails и Devise Gem - PullRequest
3 голосов
/ 16 декабря 2011

Я хотел бы изменить поведение входа в систему devise таким образом, чтобы перенаправить пользователя на другую страницу, когда этот пользователь не подтвержден.

У меня есть следующий код в моем app/controllers/sessions_controller.rb:

  # POST /user/sign_in
  def create

    @user = warden.authenticate!(:scope => :user) 
    sign_in @user
     respond_with @user, :location => after_sign_in_path_for(@user)

  end

Когда пользователь введет правильное имя пользователя / пароль и не будет подтвержден, Warden выдаст ошибку, которая перенаправит пользователя на страницу входа (код 302).В то же время это приведет к тому, что flash [: alert] будет «неподтверждено».

Есть ли способ перенаправить неподтвержденного пользователя на определенную страницу?

Моя идея обойти эту проблему былачтение значения flash [: alert] и перенаправление на соответствующую страницу, если значение «неподтверждено», но смотритель не отправляет дополнительные данные о пользователе.

Ответы [ 4 ]

2 голосов
/ 22 января 2013
class SessionsController < Devise::SessionsController
  def create
    @user = User.where(:email => params[:user][:email])[0] # you get the user now
    if @user.confirmed?
      super
    else
      redirect_to YOUR_DESIRED_path # or something else you want to do
    end
  end
end
1 голос
/ 22 декабря 2016

Для этого вам нужно специальное FailureApp (и вам нужно определить / не подтвердить его в ваших маршрутах и ​​т. Д., Как и любое другое действие Rails):

Библиотека / custom_failure.rb

class CustomFailure < Devise::FailureApp
  def redirect_url
    if warden_message == :unconfirmed
      '/unconfirmed'
    else
      super
    end
  end

  # You need to override respond to eliminate recall
  def respond
    if http_auth?
      http_auth
    else
      redirect
    end
  end
end

конфиг / Инициализаторы / devise.rb:

  config.warden do |manager|
    manager.failure_app = CustomFailure
  end
0 голосов
/ 05 февраля 2016

Я думаю, что для того, чтобы это сработало, вам нужно объединить ответ Брайана с дополнением к вашему файлу route.rb.

Я собираюсь протестировать это прямо сейчас, поэтому я дам вам обновление, если / когда я получу его работу. (РЕДАКТИРОВАТЬ: у меня это работает локально).

Вот что вам нужно сделать:

  1. Создайте новый файл в your_rails_app/app/controllers с именем sessions_controller.rb, который должен выглядеть следующим образом:

    class SessionsController < Devise::SessionsController
      def create
        @user = User.where(:email => params[:user][:email])[0] # you get the user now
        if @user.confirmed?
          super
        else
          redirect_to YOUR_DESIRED_path # or something else you want to do
        end
      end
    end
    
  2. Добавьте следующую строку в свой файл rout.rb (или измените строку в своем файле rout.rb, содержащем devise_for :users ... или как там называется ваша модель):

    devise_for :users, controllers: { sessions: "sessions" }
    
  3. Вы должны добавить это к вашей User модели:

     protected
     def confirmation_required?
       false
     end
    
0 голосов
/ 11 декабря 2013

Пожалуйста, поместите эту строку в devise.rb, если вы не хотите, чтобы неподтвержденный пользователь мог войти в систему. после успешной регистрации.

config.allow_unconfirmed_access_for = nil 
...