Falsche Benutzereingabe nach POST / Redirect / GET mit yesod-form

8

Vor kurzem bin ich über folgendes Problem gestolpert:
Mit yesod wollte ich

  1. Zeigen Sie ein anwendbares Formular an und lassen Sie den Benutzer seine Daten an einen speziellen Handler senden
  2. Am FormFailure Weiterleitung der Browser zur vorherigen Seite
  3. Drucken Sie die Fehlermeldungen ...
  4. ... und das Formular bereits ausgefüllt mit den falschen vom Benutzer angegebenen Daten erneut anzeigen

Soweit es mich betrifft, geht es hier um POST/Redirect/GET .

Während die Punkte & lt; 1-3 & gt; benötigt eine einfache und unkomplizierte Implementierung, ich fand es unmöglich, Punkt zu erreichen 4 Die yesod-Form Paket automatisch behandelt dieses Problem, aber erlaubt keine Umleitungen zwischen Form Parsing & lt; 2 & gt; und Fehlerbehandlung & lt; 3,4 & gt; wie ich es gerne hätte.

Antwort auf Michael Snoymans Antwort

Sie schlagen vor, dass ich die eingereichten Daten serialisieren und irgendwie in das Formular nach der Weiterleitung einfügen soll. Dies führt zu detaillierteren Fragen:

  1. Wie bekomme ich die Daten zum Serialisieren?

    Ich weiß, ich könnte % co_de verwenden % runRequestBody , aber welche sind die relevanten Informationen (Die :: GHandler s m RequestBodyContents s der Felder werden automatisch generiert)?

  2. Wie injizieren Sie die Daten in das Formular?

    Wenn Sie sich den Typ von z.B. aopt

    %Vor%

    Sie werden sehen, dass es den Standardwert erfordert vom gleichen Typ wie die name auf, so dass es nicht möglich ist, gelieferten Daten wieder ein, Benutzer, die nicht korrekt analysieren kann.

    Beispiel: Der Benutzer gibt ein "A" in ein Field ein. Jetzt möchte ich in der Lage sein, die ‚A‘ nach einer Umleitung im gleichen Feld angezeigt werden, aber die API erlaubt mir nicht zu.

Wie soll ich mit diesem Problem umgehen?

    
Jakub 28.03.2013, 13:49
quelle

2 Antworten

2

Ich persönlich denke, dass es akzeptabel ist, ein ausgefülltes Formular mit einer POST-Anfrage zurückzugeben, wofür die yesod-form-API optimiert ist. Wenn Sie auch bei fehlgeschlagenen Formularübermittlungen eine Umleitung erzwingen möchten, müssen Sie die übermittelten Daten serialisieren und irgendwo speichern, z. B .:

  1. In der Datenbank.
  2. In der Benutzersitzung.
  3. Als Teil der Abfragezeichenfolgenparameter für die URL, an die Sie umleiten. Beachten Sie, dass dieser Ansatz nicht für sensible Daten geeignet ist, da Zwischenproxys die Formulardaten zwischenspeichern würden.
Michael Snoyman 31.03.2013 06:31
quelle
2

Alte Frage, aber ich brauchte das heute, also könnte ich es auch für andere veröffentlichen, die auf dasselbe Problem stoßen.

Grundsätzlich können wir, wie Michael vorschlägt, die Daten in die Sitzung serialisieren. Dies zu tun ist schwierig, und es ist sogar schwieriger, es in eine Form zu bekommen. Ich musste postEnv und postHelper von Yesod.Form.Functions rippen, da sie nicht exportiert werden, aber dazu benötigt werden.

Sie können dann setLastInvalidPost in Ihrem Handler vor einer Weiterleitung verwenden und dann generateFormFromLastPost im Zielhandler verwenden.

Beachten Sie, dass es wahrscheinlich besser wäre, etwas wie Data.Serialize für die Serialisierung zu verwenden; aber Show / Read Instanzen waren gut genug für meine Bedürfnisse (und viel einfacher).

Hier ist das gute Zeug. Wenn Sie ein vollständiges funktionierendes Snippet haben möchten, können Sie sich meinen Kern ansehen .

%Vor%     
pyrospade 27.12.2014 07:59
quelle