Redirect auf vorherige Seite nach einem Login mit Devise

Devise ist eine Authentifizierungslösung für Rails-Anwendungen. Wer Devise noch nicht kennt, sollte sich die beiden Railscasts Introducing Devise und Customizing Devise von Ryan Bates ansehen. Devise tut bei mir nun seinen Dienst wie erwartet. Jedoch hatte ich bisher ein Problem. Nach einem erfolgreichen Login wird der User auf die Startseite weitergeleitet. Ich möchte aber nun meine Benutzer nach einem Login wieder auf die Seite zurückleiten, von der sie den Login-Prozess gestartet haben.

Um das standardmäßige Weiterleiten auf die Startseite zu ändern, bietet Devise mehrere Möglichkeiten. Zum einen kann man den root_path pro Scope zentral definieren, um angemeldete Benuzter z.B. auf eine Dashboardseite weiterzuleiten. Weiterhin kann der Helper after_sign_in_path_for(resource_or_scope) im eigenen ApplicationController überschrieben werden um darin auf Pfade, passend zum jeweiligen Scope und dem angemeldeten Benutzer, zu verzweigen.

Das sind jedoch nicht die Lösungen zu meinem oben genannten Problem. Ich möchte die Benutzer auf die vor dem Login aufgerufene Seite zurückleiten. Das Verhalten lässt sich auch recht einfach erzwingen. Devise nutzt nach einem erfolgreichen Login eine zum Scope passende Sessionvariable für den aufzurufenden Pfad. In meinem Fall ist der Scope :user, sodass Devise nach user_return_to sucht. Das heißt, ich muss nur an geeigneter Stelle diese Session-Variable setzen.

Da auf jeder Seite meiner Anwendung ein Link zum Login erscheint, ist die für mich geeignete Stelle der ApplicationController. In diesem Definiere ich einen before_filter, der nur in den Actions :show und :index anspringt und die Sessionvariable setzt.

Et voila: Nach einem Login springt der Browser zu der Seite zurück, die der Benuzter vor dem Login aufgerufen hat.

Das gleiche Verhalten möchte ich nun auch beim Logout. Als0 habe ich im ApplicationController den Helper after_sign_out_path_for(scope) überschrieben. Der liefert den Pfad zurück, zu dem Devise nach einem erfolgreichen Logout verzweigt.

Redirect auf vorherige Seite nach einem Login mit Devise
Markiert in: