4

私のアプリケーションには、18フィールドの大きなフォームが含まれています。これは、次のような標準形式のマッピングで処理されます。

val bigForm = Form(
  mapping(
    "id"    -> of[ObjectId],
    "title" -> text,
    // And another 16 fields...
    ...
  )
)

そして、すべてが順調でしたが、今日、私はもう1つのフィールドを追加することにしました。ここで問題が発生します。つまりmapping、18を超える引数を取ることができません。

それならどうすればいいですか?いくつかのフィールドを構造に結合することを考えていますが、構造を追加するには、追加のフォーマッター、JSONシリアライザー、およびデシリアライザーが必要であり、多くの作業が必要です。私は一般的な解決策を探しています。将来、より多くのフィールドが表示される可能性があります。

私が考えているもう1つの解決策は、フォームを手動で処理することですForm

より良い解決策はありますか?

4

2 に答える 2

4

ネストされたマッピングを使用できます。

val bigForm = Form(
  mapping(
    "id"    -> of[ObjectId],
    "title" -> text,
    "general" -> mapping(
      ...
    )(GeneralInfo.apply)(GeneralInfo.unapply),
    "advanced" -> mapping(
      ...
    )(AdvancedInfo.apply)(AdvancedInfo.unapply)
  )
)
于 2012-09-06T10:35:52.823 に答える
1

別の可能性は、ビューオブジェクトを使用し、送信された部分のみを更新することです(たとえば、個別のフォームまたはAJAXを介して)。

val generalForm = Form(
  mapping(
    "title" -> text,
    ...
  )
)

def updateGeneral(id: ObjectId) = Action { implicit request =>
  MyObject.findById(id).map { myObj =>
    generalForm.bindFromRequest.fold(
      fail => BadRequest(...),
      form => {
        val newObj = myObj.copy(title = form.title, ...)
        MyObject.save(newObj)
        Ok(...)
      }
    )
  }.getOrElse(NotFound)
}
于 2012-09-06T10:40:24.430 に答える