2008-10-23 6 views
5

So eine pfiffige individuelle Routemacht Erste individuellen Routing-Pfade

# routes.rb 
map.login '/login', :controller => 'sessions', :action => 'new' 

Besuch www.asite.com/login Ich habe für die Anmeldung zu erkennen, und du bist da. Wie bei fehlgeschlagener Anmeldung üblich, werden wir jedoch in unserer Aktion Folgendes tun. Beachten Sie, was bei fehlgeschlagener Anmeldung geschieht.

# sessions_controller.rb 

def create 
    self.current_user = User.authenticate(params[:email], params[:password]) 
    if logged_in? 
    # some work and redirect the user 
    else 
    flash.now[:warning] = "The email and/or password you entered is invalid." 
    render :action => 'new' 
    end 
end 

Dies ist sehr typisch. Rendern Sie einfach die neue Aktion und fordern Sie zur erneuten Anmeldung auf. Leider bekommst du auch eine hässliche URL: www.asite.com/session. Ick! Ist es möglich, beim Rendern die ursprüngliche URL zu berücksichtigen?

+1

Schlechtes Beispiel. Berücksichtigen Sie Situationen, in denen der Text, den der Benutzer bereits in das Formular eingegeben hat, beibehalten werden soll. Render macht das (da das Objekt teilweise aufgebaut ist). Redirect verliert den Status. –

Antwort

0

ändern render :action => 'new'-redirect_to login_path

7

Ihr Problem ist folgendes: der erste Benutzer besucht /login und füllt das Formular aus. Wenn sie das Formular absenden, senden sie an /sessions, weshalb sich die URL des Browsers ändert. Um dies zu umgehen können Sie zwei Dinge tun:

Wie Michael erwähnt, können Sie umleiten zurück in die neue Aktion, die Änderung der sonst:

else 
    flash[:warning] = "The email and/or password you entered is invalid." 
    redirect_to login_path 
end 

Beachten Sie, dass Sie benötigen, um den Blitz zu ändern Die Nachricht steht also in der nächsten Anfrage (nach der Weiterleitung) zur Verfügung.

Die zweite Methode ist etwas hackier, aber vielleicht erwähnenswert. Wenn Sie Bedingungen auf Ihren Routen verwenden, können Sie sowohl das Anmeldeformular (das ein GET-Objekt ist) als auch das Formular-Senden (das ein POST ist) dem gleichen Pfad zuordnen. So etwas wie:

Dann, wenn Ihre Formularaktion Anmeldepfad ist, sollten die Dinge so funktionieren, wie Sie es erwarten.

Verwandte Themen