4

我的应用程序包含 18 个字段的大表单。它使用标准表单映射进行处理,如下所示:

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

一切都很好,但今天我决定再添加一个字段,问题来了——mapping不能接受超过 18 个参数。

那我该怎么办?我正在考虑将一些字段组合到结构中,但是额外的结构需要额外的格式化程序、JSON 序列化器和反序列化器,工作量太大。我正在寻找一个通用的解决方案,未来可能会出现更多的领域。

我正在考虑的另一个解决方案是手动处理表单,没有Form's.

有更好的解决方案吗?

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 回答