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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top