Apr 02 2008

In Rails einen einfachen Referer erstellen

Published by Daniel Boekhoff at 19:16 under Ruby on Rails, rails 2.0

Wer in seiner Ruby on Rails Anwendung einen Loginbereich hat kennt sicher das Problem: Wer nicht eingeloggt ist wird auf die Loginseite weitergeleitet. Wenn sich dann der User erfolgreich angemeldet hat kommt er aber nicht mehr zu der Seite, die er ursprünglich direkt aufrufen wollte.

Das lässt sich sehr einfach über einen referer lösen und über das Objekt / die Variable request kann man den kompletten HTTP Request auslesen, d.h. wenn der User auf die Seite /users/editieren wollte, dann erhält man über folgenden Aufruf die notwendigen Informationen:

  1. request.referer

Referer gibt hier folgenden Wert zurück: http://localhost:3000/user/editieren

Das ist schon zu viel, wir brauchen für einen schönen redirect nach dem erfolgreichen Login eigentlich nur den Controller und die Action, die angesprochen wurde. Das lässt sich super mit request.path_parameters bewerkstelligen. Das kann man dann in ein Methode einbauen, die prüft, ob ein User eingeloggt ist. Diese steht in der application.rb und könnte so aussehen:

  1. def authorize
  2.  unless User.find_by_id(session[:user_id])
  3.   session[:referer] = request.path_parameters
  4.   flash[:notice] = "Please Log-In"
  5.   redirect_to(:controller => "/user", :action => "login")
  6.   end
  7. end

Es wird versucht die ID des Users aus der Session auszulesen(Zeile 2), wenn das nicht klappt wird die Url, die er aufrufen wollte in die Session gelegt (Zeile 3) und der User wird erst mal zum Login (Zeile 5) geschickt. In eurer Login Methode braucht Ihr nur noch nach erfolgreichem Login folgendes einzutragen:

  1. if session[:referer]
  2.  referer = session[:referer]
  3.  redirect_to(:controller => referer[:controller], :action => referer[:action] )
  4. else
  5.  redirect_to(:controller => "/user", :action => "index")
  6. end

Wenn der User wirklich woanders her kommt dann ist der referer hash nicht leer (Zeile 1) und wir können in Zeile 3 mit dem redirect dafür sorgen, dass der User ganz angenehm auf die ursptüngliche URL weitergeleitet wird. Wenn kein referer existiert wird der User ganz normal auf eine default Seite geleitet (Zeile 5)

Ich freue mich über Kommentare, Verbesserungsvorschläge, etc.

Trackback URI | Comments RSS

Leave a Reply