8


最近、次の問題yesodに出くわしました:

  1. アプリケーションフォームを表示し、ユーザーが自分のデータを特別なハンドラーに POST できるようにします
  2. ブラウザを前のページにFormFailure リダイレクトする
  3. エラーメッセージを印刷...
  4. ...そして、誤ったユーザー提供データがすでに入力されているフォームを再表示します

私に関する限り、これPOST/Redirect/GETがすべてです。

ポイント <1-3> は単純明快な実装が必要でしたが、ポイント <4> を達成することは不可能であることがわかりました。
yesod -formパッケージはこの問題を自動的に処理しますが、フォームの解析 <2> とエラー処理 <3,4> の間のリダイレクトを許可しません。

マイケル・スノイマンの回答への応答

送信されたデータをシリアル化し、リダイレクト後に何らかの方法でフォームに挿入する必要があることをお勧めします。これは、より詳細な質問につながります。

  1. シリアル化するデータを取得する方法は?

    を使用できることはわかっていますが、関連する情報はどれですか (フィールドの は自動的に生成されます)。runRequestBody:: GHandler s m RequestBodyContentsname

  2. フォームにデータを挿入する方法は?

    たとえばaoptのタイプを見ると

    aopt :: Field sub master a -> FieldSettings master -> Maybe (Maybe a) -> AForm sub master (Maybe a)
    

    デフォルト値が と同じタイプである必要があることがわかります。そのため、Field正しく解析されない可能性のあるユーザー提供のデータを再挿入することはできません。

    例: ユーザーは 'A' を に入力しintFieldます。リダイレクト後に同じフィールドに「A」を表示できるようにしたいのですが、API では許可されていません。

この問題にどう対処すればよいですか?

4

2 に答える 2