2010-12-04 5 views
1

Ich verwende AuthLogic, um Benutzer in meiner Rails-App zu authentifizieren. Dieser Teil ist eingerichtet und funktioniert ordnungsgemäß.Wie behalte ich den gleichen Controller und die gleiche Aktion in einer Seiten-URL beim erneuten Rendern einer Aktion in Rails?

Ich habe die folgende Route definiert:

map.login '/account/login', :controller => :user_sessions, :action => :new 

Aufruf Rake Routen gibt, was ich erwarte:

login /account/login {:controller=>"user_sessions", :action=>"new"} 

Wenn jemand eine Anmeldung einreicht, ruft sie UserSessionsController.create:

def create 
    @user_session = UserSession.new(params[:user_session]) 
    if @user_session.save 
     flash[:notice] = "Login successful!" 
     redirect_back_or_default account_url 
    else 
     render :action => :new 
    end 
end 

Wenn @ user_session.save fehlschlägt, werden die entsprechenden Fehlermeldungen auf dem sc angezeigt reen. Die Browser-URL ändert sich jedoch auch in "http: // localhost: 3000/user_session" anstatt auf "http: // localhost: 3000/account/login" zu bleiben.

Ich nehme an, das Problem ist, was ich in die Rendermethode füttere. Was sollte ich es füttern?

Antwort

0

Nach weiteren Graben fand ich die Lösung in einem anderen Stackoverflow Frage: Use custom route upon model validation failure

ich einfach meine Routen modifiziert, um einen neuen hinzufügen zu posieren ‚/ account/login‘:

map.login '/account/login', :controller => :user_sessions, :action => :new, :conditions => {:method => :get} 
map.login_post '/account/login', :controller => :user_sessions, :action => :create, :conditions => {:method => :post} 

Dann aktualisiert, ich meine Ansicht die neue Route zu nutzen:

<% form_for @user_session, :url => login_post_path do |f| %>

Dieses perfekt funktioniert. Eine fehlgeschlagene Anmeldung führt zu den entsprechenden Fehlermeldungen und verwaltet die URL "/ account/login".

+0

Wie mache ich es in Rails 3? – lnguyen55

+0

vergiss, mit: via! – lnguyen55

2

Dies ist eigentlich das beabsichtigte Verhalten für diesen Prozess. In einem standardgerüsteten RESTful-Controller wird ein Validierungsfehler in den Aktionen create und update die ursprüngliche Vorlage einfach ohne Umleitung rendern. Dies führt dazu, was Sie sehen - die new Vorlage wird mit der create URL der Aktion in der URL-Leiste angezeigt. Der Grund hierfür ist, dass die Ansicht Zugriff auf das ungültige Modellobjekt haben muss, das in Ihrem Fall @user_session ist, um Informationen zu dem Benutzer anzuzeigen, welche Fehler aufgetreten sind.

Sie können redirect_to anstelle von render verwenden, wenn Sie eine Umleitung auf die ursprüngliche URL erzwingen möchten. Dadurch gehen jedoch Informationen über die Fehler verloren. Sie müssten die Fehler in der Sitzung manuell beibehalten, was unordentlich wäre. Mein Rat ist, sich nicht darum zu kümmern, dass die URL nicht mit der des Originals übereinstimmt, da dies in allen Rails-Apps ziemlich Standard ist.

+0

Ich schätze den Vorschlag, aber ich finde die erzwungene Inkonsistenz beunruhigend.Jeder, der Fehler auf einer Seite erhält und sie melden möchte, wird mit einer Seite verlinkt, deren Link beim Anklicken keinen Sinn ergibt. Die Verwendung eines redirect_to und das Fortbestehen der Fehler ist, wie Sie sagen, ebenfalls unordentlich. – Shaun

+0

Es gibt nicht wirklich eine andere Wahl. Die Daten müssen irgendwie beibehalten werden. Entweder machst du keine Weiterleitung oder du speicherst sie irgendwo und redirect. –

+0

Ich fand einen einfachen Weg, um mein Ziel zu erreichen, ohne meine Controller und Ansichten auf diese Weise komplizieren zu müssen. Siehe akzeptierte Antwort. – Shaun

1

Nur Add-Lösung für Rails 4 (basierend auf Shaun Antwort hier):

neue Route In den Routen-Datei:

Post '/ Karren/new' => 'Karren # erstellen', wie: : create_post

Add url: create_post_path Tag Geschehen zu bilden

.