わさび唐辛子

いざという時のための備忘録

【Scala】【Play Framework】同一Form内で複数サブミットボタンを実装する

同一Form内で押下されたボタンに応じて処理を変更する

以下のように、同一Form内に複数のサブミットボタンが存在する場合に、

サーバ側の処理を分岐させたい。

@form(controllers.Sample.execute) {
  <input type="submit" name="btnDelete" value="削除" />
  <input type="submit" name="btnSubmit" value="更新" />
}

 

このような場合、Formオブジェクトにボタンをバインドさせると、

押下されたボタンにのみ値がバインドされ、押下されていないボタンには

Noneがバインドされる。

case class SampleForm(
  btnDelete: Option[String] = None,   // 削除ボタン
  btnSubmit: Option[String] = None    // 更新ボタン
)

 

object Sample extends Controller {
val myForm: Form[SampleForm] = Form(mapping(
"btnDelete" -> optional(text),
"btnSubmit" -> optional(text)
)(SampleForm.apply)(SampleForm.unapply))
 ・
 ・
 ・
def execute {
val form = myForm.bindFromRequest.get (form.btnDelete, form.btnSubmit) match { case (Some(_), _) => // 削除処理 case (_, Some(_)) => // 更新処理 case _ => // 例外処理 }
}
}

(form.btnDelete, form.btnSubmit)は、

削除ボタン押下時に

 (Some(削除), None)

となり、更新ボタン押下時に

 (None, Some(更新))

となる。