Erste macht individuelle Routing-Pfade zu erkennen
-
04-07-2019 - |
Frage
Also ich habe eine pfiffige individuelle Route für login
# routes.rb
map.login '/login', :controller => 'sessions', :action => 'new'
Besuchen Sie www.asite.com/login und du bist da. Wie Brauch mit fehlgeschlagenen Login ist jedoch werden wir die folgenden in unserer Aktion tun. Beachten Sie, was bei nicht erfolgreicher 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
Das ist sehr typisch. Einfach die neue Aktion machen und wieder zur Anmeldung aufgefordert. Leider erhalten Sie auch mit ihm eine hässliche URL: www.asite.com/session. Ick! Ist es möglich, die ursprüngliche URL zu respektieren zu bekommen Rendering?
Keine korrekte Lösung
Andere Tipps
Ihr Problem ist folgendes: der Benutzer ersten Besuche /login
und füllt das Formular aus. Wenn sie das Formular, Post an sie /sessions
, weshalb der Browser-URL ä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 an:
else
flash[:warning] = "The email and/or password you entered is invalid."
redirect_to login_path
end
Beachten Sie, dass Sie den Blitz ändern müssen werden, so dass die Nachricht in der nächsten Anfrage (nach der Umleitung) zur Verfügung.
Die zweite Methode ist leicht hackier, aber vielleicht erwähnenswert. Durch die Verwendung von Bedingungen auf der Route können Sie sowohl das Anmeldeformular Karte (die eine GET) und senden Sie das Formular (das ist ein POST) auf dem gleichen Weg. So etwas wie:
map.login '/login',
:controller => 'sessions', :action => 'new',
:conditions => {:method => :get}
map.login_submit '/login',
:controller => 'sessions', :action => 'create',
:conditions => {:method => :post}
Dann, wenn das Formular Aktion Login Weg einreichen, sollen die Dinge funktionieren wie erwartet.
Ändern render :action => 'new'
redirect_to login_path