PlayFramework で、フォームから配列を POST する方法です。
値の配列とオブジェクトの配列で書き方が若干異なります。
オブジェクトの配列を POST する方法を探すのが大変だったので共有します。
String の配列を POST する
1つめは値の POST についてです。
ここでは名前(String)の配列を送信してみます。
View
配列を送信するには、name
属性の値に []
を付けることで実現できます。
<form>
<input type="hidden" name="names[]" value="Alice" />
<input type="hidden" name="names[]" value="Bob" />
</form>
Controller
Form オブジェクトを作成する際に項目の型を list
で囲むことで、 List[A]
型で受け取ることが可能です。
case class FormParam(names: List[String])
val form = Form(
mapping(
"names" -> list(text)
)(Names.apply)(Names.unapply)
)
def api = Action { implicit request =>
form.bindFromRequest.fold(
errForm => BadRequest(...)
param => {
val names = param.names // List(Alice, Bob)
}
)
}
オブジェクトの配列
つぎに、オブジェクトの配列を POST する方法です。
{ name: String, sex: String }
のようなオブジェクトの配列を POST してみます。
View
ポイントは、name
属性の書き方です。
配列にインデックスを付ける必要があることと、オブジェクトのプロパティは.hoge
と指定することです。
<form>
<input type="hidden" name="users[0].name" value="Alice" />
<input type="hidden" name="users[0].sex" value="Female" />
<input type="hidden" name="users[1].name" value="Bob" />
<input type="hidden" name="users[1].sex" value="Male" />
</form>
Controller
Controller 側では、オブジェクトのリストで受け取ることができます。
case class FormParam(users: List[UserParam])
case class UserParam(name: String, sex: String)
val form = Form(formParamMapping)
val formParamMapping = mapping(
"users" -> userParamMapping
)(FormParam.apply)(FormParam.unapply)
val userParamMapping = mapping(
"name" -> text,
"sex" -> text
)(UserParam.apply)(UserParam.unapply)
def api = Action { implicit request =>
form.bindFromRequest.fold(
errForm => BadRequest(...)
param => {
val users = param.users // List(UserParam(Alice, Female), UserParam(Bob, Male))
}
}
}
まとめ
Controller 側というより View 側が重要ですね。
- 配列を送信する際は
input
タグのname
属性をhoge[]
のように配列で指定する - オブジェクトの配列を送信する際は
input
タグのname
属性をhoge[0].fuga
のように配列のインデックスとプロパティ名を指定する