Die richtige Methode zum Behandeln ungültiger Formularübermittlungen in Rails

9

Ich bin neu bei Schienen und bin mir nicht sicher, ob ich der Art und Weise zustimme, wie ich in einigen der Tutorials, die ich durchlaufen habe, etwas getan habe. Das Problem hat damit zu tun, wie ungültige Formularübermittlungen behandelt werden. Die übliche Vorgehensweise scheint zu sein:

%Vor%

Wenn @ thing.save fehlschlägt, wird dem Benutzer das gleiche Formular angezeigt, das mit den Werten, die er gerade eingegeben hat, vorausgefüllt wurde, zusammen mit einem Blitz dessen, was schief gelaufen ist. So weit, so gut, nur dass die URL nun von / sachen / neu zu sachen / geändert wurde, was man erwarten würde, stattdessen die Indexansicht zu rendern.

Wenn der Benutzer die Seite aktualisiert, schaut er sich jetzt die Indexansicht an. Wenn er zurückklickt, wird er aufgefordert, das Formular erneut zu senden, was ich immer versucht habe zu vermeiden. Wenn ich redirect_to (new_thing_path), ist die vorherige Übermittlung des Benutzers verloren, ebenso wie die Fehlermeldungen.

Ich stelle fest, dass diese Methode RICHTIG "korrekt" sein kann, da die Erstellung eines Thing-Objekts das Ergebnis von POST an / Dinge sein sollte, aber Benutzeroberflächen-weise, ich kümmere mich nicht besonders darum.

Ich könnte "manuell" das ungültige @ thing-Objekt in der Benutzersitzung speichern, um angezeigt zu werden, nachdem ich ihn zurück zu new_thing_path umgeleitet habe, aber das fühlt sich an wie ein Hack. Es scheint, als ob es einen "Schienen-Weg" geben sollte, genau das zu tun.

Ideen?

    
dearlbry 18.02.2011, 22:10
quelle

2 Antworten

3

Wie Sie festgestellt haben, ist der POST-Pfad zum Erstellen einer neuen Sache standardmäßig auf resources :things festgelegt, wenn Sie /things angeben. Hier ist die Ausgabe für rake routes :

%Vor%

Es klingt, als wolltest du etwas mehr so:

%Vor%

Obwohl nicht empfohlen, können Sie dieses Ergebnis mit der folgenden Route erhalten:

%Vor%

Sie müssten auch Ihre Formulare ändern, damit sie an den richtigen Pfad gesendet werden.

Alles, was gesagt wird, die Beschreibung der URLs, die Sie in Ihrer Frage haben, klingt nicht richtig. Sie listen Folgendes auf: Nach dem Einreichen eines neuen thing (Senden eines Formulars an /things/new ),

  1. Die URL ändert sich von /things/new in /things
  2. Wenn Sie auf Zurück klicken, werden Sie aufgefordert, das Formular
  3. erneut zu senden
  4. Erfrischende Shows things#index

Dies ist nicht die Funktionalität, die ich in meinen eigenen Rails 3-Anwendungen erfahre. Stattdessen finde ich Folgendes: Nach dem Einreichen einer neuen thing (Senden eines Formulars bei /things/new ),

  1. Die URL ändert sich von /things/new zu /things (das ist das Gleiche)
  2. Ein Klick zurück bringt den Benutzer zurück zum nicht -übermittelten Formular (keine Anfrage für einen erneuten Post)
  3. Aktualisierungsaufforderungen zur erneuten Übermittlung des Formulars (wie von mir erwartet)
Michelle Tilley 20.02.2011, 00:22
quelle
0

Ich weiß, dass dies eine alte Frage ist, aber ein Ansatz, mit dem ich in letzter Zeit gespielt habe, ist, das Formular mit AJAX einzureichen, auch wenn es sonst nicht erforderlich wäre. Auf diese Weise können Sie sie an die Standard-Erstellungs- / Aktualisierungsaktion für die Routen senden, die URL im Browser ändert sich jedoch nicht. Die Antwort kann eine einfache 200 für den Erfolg mit einer Verknüpfung zu der / Index-Seite oder wo immer Sie bei einer erfolgreichen Speicherung umleiten, oder eine "400 ungültige Anforderung" mit Fehlermeldung (s), wenn Daten ungültig waren.

sein

Der größte Nachteil ist, dass die Anzeige der Fehlermeldungen und ungültigen Felder jetzt vollständig in der Verantwortung Ihres clientseitigen Javascript liegt. Dies wird zu einem viel kleineren Problem und kann sogar eine gute Sache sein, wenn Sie auf der Client-Seite etwas wie Backbone oder KnockoutJS verwenden.

    
sockmonk 03.06.2014 14:13
quelle

Tags und Links