2012-02-10 7 views
17

Po włączeniu modułu potwierdzającego, Devise uniemożliwi niepotwierdzonemu użytkownikowi zalogowanie się po upływie ustalonego czasu. Zamiast tego użytkownik jest przekierowywany z powrotem do strony logowania z wiadomością błyskawiczną "Musisz potwierdzić swoje konto, zanim przejdziesz dalej".Devise with Confirmable - Przekieruj użytkownika do niestandardowej strony, gdy użytkownicy próbują zalogować się przy użyciu niepotwierdzonej wiadomości e-mail.

Jest to niepożądany model interakcji, ponieważ powiadomienie Flash nie zapewnia wystarczającej przestrzeni do prawidłowego wyjaśnienia użytkownikowi, dlaczego odmówiono dostępu, co oznacza "potwierdzenie konta", podaj link do ponownego wysłania potwierdzenia i instrukcje o tym, jak sprawdzić folder spamu i tak dalej.

Czy istnieje sposób mogę to zmienić, aby przekierować do określonego adresu URL zamiast?

Odpowiedz

27

Niestety na początku myślałem, że chodziło po Zapisz się nie zalogować. Tak więc poniżej dół pracuje jak kierować użytkowników po Zarejestruj się i co trzeba zrobić dla Logowanie jest stworzenie zwyczaj Opracować :: FailureApp

Zobacz stronę wiki: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated

Następnie w swoim zwyczaju FailureApp nadpisać redirect_url metodę z 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 

dla niestandardowych przekierowanie po Zapisz się:

Istnieje metoda kontroler after_inactive_sign_up_path_for w RegistrationsContro ller, który można zastąpić, aby to osiągnąć.

pierwsze w swoich tras trzeba będzie określić w użyciu kontrolera niestandardowe:

config/routes.rb:

devise_for :users, :controllers => { :registrations => "users/registrations" } 

drugie utworzyć kontroler niestandardową, która dziedziczy z normalnego sterownika w celu nadpisania metody :

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 

W tym przypadku dla mojej aplikacji moim modelem Devise jest użytkownik, więc możesz chcieć zmienić tę przestrzeń nazw, jeśli twój model ma inną nazwę. Chciałem, aby moi użytkownicy zostali przekierowani na numer signed_up_path, ale możesz to zmienić na wybraną ścieżkę.

9

I właśnie to zrobił, ale miała inne podejście.

w 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 

ten pracował dla mnie i wydawało się minimalnie inwazyjne. W mojej aplikacji nowe sesje zawsze muszą przejść przez sessions#create, a użytkownicy zawsze logują się za pomocą swojego adresu e-mail, więc może to być prostsze niż Twoje.

Możesz oczywiście wybrać dowolne miejsce w metodzie check_user_confirmation. new_confirmation_path było dla mnie logicznym wyborem, ponieważ zapewnia użytkownikom zasoby do uzyskania potwierdzenia.

+0

jedno pytanie: w jaki sposób mogę znaleźć użytkownika, kiedy będzie mógł zalogować się podając nazwę użytkownika lub e-mail? Tak więc jako parametr wprowadzamy parametr ': login', który może być adresem e-mail użytkownika lub nazwą użytkownika. – jonhue

0

To jest moje rozwiązanie trzeba dodać: niepotwierdzoną wiadomość opracować lokalizacjach poniżej sesjach.

w app/controllers/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 
Powiązane problemy