Vor kurzem bin ich über folgendes Problem gestolpert:
Mit yesod
wollte ich
FormFailure
Weiterleitung der Browser zur vorherigen Seite 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.
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:
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)?
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?
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 .:
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%Tags und Links haskell forms post-redirect-get yesod