LoginSignup
13
12

More than 5 years have passed since last update.

PlayFramework で フォームから配列(値およびオブジェクト)を POST する

Last updated at Posted at 2015-01-23

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 のように配列のインデックスとプロパティ名を指定する
13
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12