2012-06-07 19 views
35

Wie kann ich eine Nachbestätigung Redirect in Devise erstellen?Devise Redirect nach Bestätigung

Bevor ich die confirmation module hinzugefügt der Brauch after_sign_up_path hat gut funktionierte zum ersten Mal login/signup aber wenn ich jetzt auf den Bestätigungslink in der E-Mail klicken leitet es auf den Pfad i für das nach dem Login Pfad (Benutzerprofil) gesetzt.

Mein Ziel ist es, einen Formularassistenten und eine "Erste Schritte" -Seite zu erstellen, um zusätzliche Informationen zu sammeln. Der offensichtliche Nachteil ist, dass diese Weiterleitung nur einmal stattfinden wird, nach der Bestätigung.

ich einige andere Lösungen versucht haben, die auf dem Stack, aber keiner von ihnen geschrieben wurden scheinen nicht mehr zu arbeiten ..

Antwort

19

Grunde wollen Sie diese Zeile von der sich ändern Devise ConfirmationsController:

https://github.com/plataformatec/devise/blob/master/app/controllers/devise/confirmations_controller.rb#L25

Dies bedeutet, dass Sie die Show-Aktion überschreiben müssen. Ändern Sie einfach den glücklichen Weg des „if“ Anweisung in der Show Aktion zum Inhalt Ihres Herzens:

class ConfirmationsController < Devise::ConfirmationsController 
    def new 
    super 
    end 

    def create 
    super 
    end 

    def show 
    self.resource = resource_class.confirm_by_token(params[:confirmation_token]) 

    if resource.errors.empty? 
     set_flash_message(:notice, :confirmed) if is_navigational_format? 
     sign_in(resource_name, resource) 
     respond_with_navigational(resource){ redirect_to confirmation_getting_started_path } 
    else 
     respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render_with_scope :new } 
    end 
    end 
end 

Und ein scoped Weg für sie (ich die Ansicht und Aktion in der Registrierungen Controller setzen, aber Sie können es ändern zu was auch immer):

devise_for :users, controllers: { confirmations: 'confirmations' } 
devise_scope :user do 
    get '/confirmation-getting-started' => 'registrations#getting_started', as: 'confirmation_getting_started' 
end 

die Standard-show-Aktion bezieht sich auf die geschützten after_confirmation_path_for Methode, um eine andere Option, könnten Sie genau das, was diese Methode zurückkehrt ändern.

+0

Wenn ich eine confirmations_controller.rb zu meiner App hinzufüge, hat das Vorrang vor dem einen Gerät? Wie würde ich sonst den von Devise gelieferten bearbeiten? – js111

+0

Ja, Sie überschreiben den ConfirmationsController von Devise, damit Sie Ihre eigenen Änderungen vornehmen können ... was ich dachte, ist, was Sie versucht haben zu tun. Siehe auch meine Bearbeitung zu meiner Antwort ... Ich habe den Zusatz zu der routes-Datei vergessen, wo Sie angeben, dass Sie Ihren eigenen ConfirmationsController verwenden. Viel Glück! –

+0

Nun, Sie überschreiben nur die Methoden/Aktionen, die Sie definieren. Alle Methoden, die Sie nicht berühren, werden an Devise :: ConfirmationsController gesendet. – niels

18

Haben Sie die Devise wiki? Es wird erklärt, wie dies zu tun ist, wobei after_signup_path_for der Pfad ist, der in Ihrem Fall definiert wird.

aus dem Wiki:

erstellen einen neuen Controller RegistrationsController:

class RegistrationsController < Devise::RegistrationsController 
    protected 

    def after_sign_up_path_for(resource) 
    '/an/example/path' 
    end 
end 

und fügen Sie eine Route, es zu benutzen:

devise_for :users, :controllers => { :registrations => "registrations" } 
+7

after_sign_up funktioniert nicht mit der: confirmable Modul – js111

+0

Haben Sie bedeuten, dass Sie die Umleitung wollen das Konto geschehen nach dem Erstellen, aber vor der Bestätigung? Dann sollten Sie 'after_inactive_sign_up_path_for' einstellen. Es ist in der Devise Wiki-Seite, mit der ich verlinkt bin, aber nur in einer kleinen Linie zwischen Beispielen, leicht zu übersehen (es hat eine Weile gedauert, das herauszufinden, als ich es brauchte ...). – niels

+0

Hier ist der Verweis auf den 'after_inactive_sign_up_path_for', der Niels erwähnt: [Devise wiki] (https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on- Erfolgreich-Anmeldung- (Registrierung)) – marrossa

117

Ein weniger aufdringlicher Weg, um dies zu erreichen, könnte nur die after_confirmation_path_for Methode von Devise::ConfirmationsController überschreiben.

ein Neues confirmations_controller.rb in app/controllers Verzeichnis:

class ConfirmationsController < Devise::ConfirmationsController 

    private 

    def after_confirmation_path_for(resource_name, resource) 
    your_new_after_confirmation_path 
    end 

end 

In config/routes.rb, diese Zeile hinzufügen, damit Devise Ihre benutzerdefinierten ConfirmationsController verwenden. Dies setzt voraus, dass Devise auf users Tabelle arbeitet (Sie können bearbeiten, um Ihre zu entsprechen).

devise_for :users, controllers: { confirmations: 'confirmations' } 

Starten Sie den Webserver neu, und Sie sollten es haben.

+11

@azure_ardee Das stimmt nicht. Diese neue Hash-Syntax wurde in Ruby 1.9 eingeführt und funktioniert gut für neuere Ruby-Versionen – jhdavids8

+0

Danke dafür. Ich frage mich, warum diese grundlegenden Pfade nicht über die Gerätekonfiguration definiert werden können ... –

+2

das ist die beste Antwort. –

-2

Die confirmation_path muss auch so konfiguriert werden, während mit refinerycms integriert in einer Rails-Anwendung

+3

Was hat raffinerycms mit dieser Frage zu tun? – armchairdj

1

ich nur wen durch all dies, und keiner der anderen Antworten gearbeitet Arbeits (2015.04.09 mit devise 3.4.1).

Was ich wollte war nach der Anmeldung, der Benutzer wird auf die Anmeldeseite mit einer Nachricht über eine Bestätigungs-E-Mail weitergeleitet. Um diese Arbeiten zu bekommen, hier ist das, was ich zu tun hatte:

class RegistrationsController < Devise::RegistrationsController 

protected 
    # This is the method that is needed to control the after_sign_up_path 
    # when using confirmable. 
    def after_inactive_sign_up_path_for(resource) 
    new_user_session_path 
    end 

end 

EDIT: Ich habe gerade diesen Kommentar unter denen genau gesendet würden Sie mir, wo ich brauchte viel früher zu sein.

Hier ist der Hinweis auf die after_inactive_sign_up_path_for dass Niels erwähnt: Entwickeln wiki - marrossa 13. November '12 bei 3:38

1

Die von der @Lee Smith gegebene Lösung funktioniert perfekt, aber ich wünschte, Um eine kleine Ergänzung hinzufügen, das ist müssen wir nicht die neue hinzufügen und Aktion erstellen, während die Devise Bestätigungen Controller für diesen Fall überschreiben.

Gleichwie:

class ConfirmationsController < Devise::ConfirmationsController 
    def show 
    self.resource = resource_class.confirm_by_token(params[:confirmation_token]) 

    if resource.errors.empty? 
     set_flash_message(:notice, :confirmed) if is_navigational_format? 
     sign_in(resource_name, resource) 
     respond_with_navigational(resource){ redirect_to your_desired_redirect_path } 
    else 
     respond_with_navigational(resource.errors, status: :unprocessable_entity){ render_with_scope :new } 
    end 
    end 
end 

Dann in der Routendatei, fügen Sie einfach das Routing für die Bestätigungen Controller.

devise_for :users, controllers: { confirmations: "confirmations" } 
Verwandte Themen