環境 :
- Playframework 2.4.2

実現したい事:

  • マルチセレクトのチェックボックスを、Play 標準の helper のように定義したい。
  • 動作仕様として下記のように使いたい

    @myhelper.multipleCheckBox(c("multiSelect"), Map("first" -> "1", "second" -> "2", "third" -> "3"))

作成したコード:

(field: play.api.data.Field, keyValues: Map[String, String])(implicit messages: play.api.i18n.Messages)
@helper.input(field) { (id, name, value, htmlArgs) =>

  @{value.toString}
  @{value.getClass.toString}

  @defining(keyValues.toList.zipWithIndex){ results =>
    @for(kv_i <- results){
    <label class="checkbox-inline">
        <input id="@{id}_@{kv_i._2}" name="@{name}[@{kv_i._2}]" type="checkbox"
            value="@{kv_i._1._2}" @if(value.exists(v => {keyValues.exists(_._2 == v)})){checked="true"}> @kv_i._1._1
    </label>
    }
  }
}

問題点:

  • バインドした際に、「selected」属性がつかない。

    val checkBoxes = Form(single("multiSelect" -> list(longNumber)))
    val test = checkBoxes.bind(Map("multiSelect[0]" -> "2"))
    println(test.value) // Some(List(2)) が表示
    println(test("multiSelect"))
    // 下記が出力(Form には value 値があるものの、Field にはない)
    // Field(Form(play.api.data.ObjectMapping1@58b5f405,Map(multiSelect[0] -> 2),List(),Some(List(2))),multiSelect,List(),None,List(),None)

    しかし、この form を画面テンプレートに送っても、value 値は「None class scala.None$」の表示。

そもそも target にバインドされた時の型が Option[List[String]] や、Option[List[Long]] のような気がしないでもないので、target に値が入っても上記コードで出ない気はしますが、そもそも target が None のままで困っています。
これは自分のコード上のミスなのか、仕様なのかバグなのか…それすらわからない状況なので、知っている方是非ご教授下さい。

尚、レンダリング時は、下記の様な html が吐かれていて、チェックした時にサーバでバインド→値の取得はできています。

<div class="col-sm-10">
    None
    class scala.None$
    <label class="checkbox-inline">
        <input id="multiSelect_0" name="multiSelect[0]" type="checkbox" value="1"> first
    </label>
    <label class="checkbox-inline">
        <input id="multiSelect_1" name="multiSelect[1]" type="checkbox" value="2"> second
    </label>
    <label class="checkbox-inline">
        <input id="multiSelect_2" name="multiSelect[2]" type="checkbox" value="3"> third
    </label>
</div>