2010-05-07 5 views
5

Wenn ich auf einem Route-Alias ​​wie/register bin und ich einen Formularfehler habe und ich render: new, ist es möglich, dass der Pfad noch/register ist?umleiten zu einem Route-Alias ​​bei einem Formularüberprüfungsfehler

Im Moment ist es rendert/new

ich einen redirect_to register_path tun könnte, aber dann würde ich die params verlieren?

Es macht den folgenden Test fehlschlagen:

Scenario: Try registering with a bad staff number 
Given I am on the registration page 
When I fill in "email" with "[email protected]" 
And I fill in "First Name" with "Kevin" 
And I fill in "last name" with "Monk" 
And I fill in "Employee Number" with "something barking123" 
And I press "Register" 
Then I should be on the registration page 
And I should see "Your employee ID number looks incorrect." 
+1

ich ein ähnliches gefragt Frage und bekam eine Antwort, siehe http: // stackoverflow.com/questions/1083798/use-custom-route-nach-model-validation-failure –

+0

Für die Liebe von Jobs, korrigieren Sie bitte die Grammatik im letzten Satz. Sie möchten nicht, dass Ihre Website bei Error angezeigt wird. "Ihre Mitarbeiter-ID-Nummer sieht nicht korrekt aus." – mcandre

+0

Oh ja! guter Punkt. Ihr Recht! –

Antwort

1

Eine Alternative wäre, zwei "Register" -Routen einzurichten. Eine, die nur GET-Anfragen akzeptiert (und zu der: new-Aktion geht) und die andere, die nur POST-Anfragen akzeptiert (und geht zur create-Aktion, aber rendert die gleiche Vorlage wie für new).

dies aussehen könnte:

map.get_register 'register', :controller => :registrations, 
       :action => :new, :conditions => { :method => :get } 
map.post_register 'register', :controller => :registrations, 
       :action => :create, :conditions => { :method => :post } 

Dann in Ihrem Controller:

def new 
    @registration = Registration.new 
    # renders the 'registrations/new' template 
end 
def create 
    @registration = Registration.new(params[:registration]) 

    # render the 'registrations/new' template if we fail validation 
    return render(:action => :new) unless @registration.save 
    # otherwise renders the "create" template which is likely a thank-you 
end 

Es scheint in dieser Frage in ähnlicher Weise mehr zu sein: Use custom route upon model validation failure

+0

Hallo Taryn, THat ist genau das, was ich am Ende getan habe. Danke für Ihre Antwort. Kevin. –

1

Die Rails Way ist die „neue“ (dh Register) Aktion wieder zu machen, da Sie das Objekt erstellt haben, enthält das Formular die zuvor eingegebenen Werte sowie Fehlermeldungen. Wenn Sie umleiten, müssen Sie das Objekt in der Sitzung oder in der Datenbank speichern, bevor Sie die Umleitung ausführen. Wenn man von den Konventionen abweicht, ist es immer gut, aus gutem Grund sicher zu sein, dass man es tut.

1

Der Aufruf von Render von einer Aktion bedeutet, dass die URL unverändert bleibt, unabhängig davon, was GET oder POST wurde. Der Grund dafür, dass die URL/new ist, ist, dass "Registrieren" an/neu gesendet werden muss. Wenn Sie möchten, dass diese Funktion besteht, sollten Sie "Dann sollte ich auf der Registrierungsseite sein" auf "Dann sollte ich auf der neuen Registrierungsseite sein" schreiben und den entsprechenden Webschritt schreiben, meiner Meinung nach.

0

Wenn Sie das wirklich wollen, dann könnten Sie Ihre "create" Aktion in Ihre "neue" Aktion und Ihre "update" Aktion in Ihre "edit" Aktion einbinden. Sie müssten dann den Anfragetyp prüfen und entsprechend bearbeiten.

Dies würde erreichen, was Sie verlangen. Außerdem könnten Benutzer die URL "error" verwenden und trotzdem zu einer gültigen Seite wechseln. Das heißt, selbst nach dem Auftreten eines Fehlers könnten sie die URL kopieren und einfügen und es würde eine gültige GET-Seite dafür geben.

Das gesagt, dies ist ein wichtiger Hack und nicht etwas, das ich Ihnen empfehlen. Sie müssen eine Menge Beinarbeit machen und die Oberseite ist winzig.

Edit: Beispiel ..

def new 
    if request.get? 
    @user = User.new 

    elsif request.post? 
    @user = User.new(params[:user]) 
    if @user.save 
     redirect_to users_path 
    else 
     render :new 
    end 
    end 
end 

Sie müssen auch eigene Routen hinzuzufügen.

0

Wirklich, das sieht wie ein Ein-Zeilen-Fix im Test aus. (Warum bevorzugen Sie es, auf der Seite/register zu sein?).

Wenn es wirklich wichtig ist, können Sie auch Parameter in der Session var vorübergehend speichern.

Verwandte Themen