0

私はスカラ言語とタイプセーフ言語を初めて使用するので、基本的なことを見落としている可能性があります。つまり、ここに私の問題があります。

目標: 1 つのテキスト入力だけで、ケース クラスを反映していないフォームを送信したい。最終的には次のタイプになります: String

問題:フォールドから成功できない

フロントエンドに、play のフォーム ヘルパーの代わりに html で記述することを選択したフォームがあります (これが問題である場合は、喜んで変更します)。

<form method="POST" action="@routes.Application.shorten()">
  <input id="urlLong" name="urlLong" type="text" placeholder="http://www.google.com/" class="span4"/>
  <div class="form-actions">
    <button type="reset" class="btn">Reset</button>
    <button type="submit" class="btn btn-primary pull-right"><span class="icon-random"></span> Shrtn It!</button>
  </div>
</form>

ポスト アクションを処理するコントローラーは次のようになります。

import ...

object Application extends Controller {

  val newUrlForm = Form(
    "urlLong" -> text
  )

  def shorten = Action { implicit request =>
    val urlLong = newUrlForm.bindFromRequest.get

    newUrlForm.fold(
      hasErrors = { form =>
        val message = "Somethings gone terribly wrong"
        Redirect(routes.Application.dash()).flashing("error" -> message)
    },

    success = { form =>
      val message = "Woot it was successfully added!"
      Redirect(routes.Application.dash()).flashing("success" -> message)
    }
  }
  ...
}

私は Play for Scala book のチュートリアルをフォロー/変更しようとしていましたが、フォームはケース クラスに一致しており、Play のチュートリアルも私のユース ケースとは少し異なります。あなたの答えに加えて、あなたがそれをどのように理解したかを含めることができれば、それは本当に役に立ちますので、私は自分でよりよくトラブルシューティングできます.

また、重要な場合は、intellijのアイデアをアイデアとして使用しています

4

2 に答える 2

1

form.bindFromRequestで fold メソッドを呼び出す必要があります。ドキュメントから> バインディングの失敗の処理

loginForm.bindFromRequest.fold(
  formWithErrors => // binding failure, you retrieve the form containing errors,
  value => // binding success, you get the actual value 
)

また、単一のフィールドに対して単一のマッピング構造を使用することもできます

Form(
  single(
    "email" -> email
  )
)
于 2013-02-18T17:10:16.383 に答える
0

私が最終的に得たもの:

def shorten = Action { implicit request =>
  newUrlForm.bindFromRequest.fold(
    hasErrors = { form =>
      val message = "Somethings gone terribly wrong"
      Redirect(routes.Application.dash()).flashing("error" -> message)
    },

    success = { urlLong =>
      val message = "Woot it was successfully added!"
      Redirect(routes.Application.dash()).flashing("success" -> message)
    }
  )
}

私が間違っていたことを本当に理解しているかどうかはわかりませんが、 mericano1 の答えに基づいたこのコードも同様に機能しました。以前は、フォームから urlLong val を取得してからフォームを折りたたんでいたようですが、フォームを直接折りたたんで、その過程で urlLong の val を抽出していました。

また、fold の引数が異なる方法で文書化されている理由もわかりません。

于 2013-02-18T20:21:56.913 に答える