4

フォーム送信から値のリストを受け取り、それをオブジェクトのリストにバインドしようと必死になっています。

動作するのは、単一の行を取得することです。

//class
case class Task(name: String, description: String)

val taskForm: Form[Task] = Form(
  mapping(
  "name" -> text,
  "description" -> text

  )(Task.apply)(Task.unapply)
)


//form
<tr>
  <td><input name="name" type="text" class="span2" placeholder="Name..."></td>
  <td><textarea name="description" class="autoexpand span7" rows="1"     placeholder="Description..."></textarea>
  </td>
</tr>

//receiving action:
val task = taskForm.bindFromRequest.get

しかし今、私はこのようなタイプのタスクの複数のオブジェクトを提出したいと思います:

<tr>
  <td><input name="name[0]" type="text" class="span2" placeholder="Name..."></td>
  <td><textarea name="description[0]" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>                   
</tr>
<tr>
  <td><input name="name[1]" type="text" class="span2" placeholder="Name..."></td>
  <td><textarea name="description[1]" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>                   
</tr> 

taskForm.bindFromRequest.getの実行は失敗します。

誰かがこれに対する解決策を思いついたのですか?それとも、そのような状況をまったく異なる方法で処理しますか?

4

2 に答える 2

17

さて、ドキュメントをもう一度見るように私にほのめかしてくれてありがとう、私はすでにそれらを見ました、しかしそれを機能させるためにそれを組み合わせる方法を作ることは決してできませんでした。これは私が完全なscalanoobだからだと思います。しかし、私はそれをもう一度与えた後にそれを動作させました、これは私の解決策です:

//classes
case class Task(name: String, description: String)
case class Tasks(tasks: List[Task])

val taskForm: Form[Tasks] = Form(
  mapping(
  "tasks" -> list(mapping(
    "name" -> text,
    "description" -> text
  )(Task.apply)(Task.unapply))
)(Tasks.apply)(Tasks.unapply)
)

//form
<tr>
  <td><input name="tasks[0].name" type="text" class="span2" placeholder="Name..."></td>
  <td><textarea name="tasks[0].description" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>                   
</tr>
<tr>
  <td><input name="tasks[1].name" type="text" class="span2" placeholder="Name..."></td>
  <td><textarea name="tasks[1].description" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>                   
</tr>

そして最後に:

val tasks = taskForm.bindFromRequest.get

タスクのリストを取得します。

于 2012-04-19T07:26:25.093 に答える
2

PlayFrameworkのドキュメントページから:

繰り返される値

フォームマッピングでは、繰り返し値を定義することもできます。

case class User(name: String, emails: List[String])

val userForm = Form(
  mapping(
    "name" -> text,
    "emails" -> list(text)
  )(User.apply, User.unapply)
)

このような繰り返しデータを使用する場合、ブラウザから送信されるフォーム値には、emails [0]、emails [1]、emails[2]などの名前を付ける必要があります。

于 2012-04-19T00:05:00.800 に答える