使用Play 2处理非常长的表单

时间:2012-09-04 12:54:31

标签: forms scala playframework-2.0

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

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

一切都很顺利,但今天我决定又添加一个字段,问题就出现了 - mapping无法超过18个参数。

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

我正在考虑的另一个解决方案是手动处理表单,而不是Form

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:4)

您可以使用嵌套映射,例如

val bigForm = Form(
  mapping(
    "id"    -> of[ObjectId],
    "title" -> text,
    "general" -> mapping(
      ...
    )(GeneralInfo.apply)(GeneralInfo.unapply),
    "advanced" -> mapping(
      ...
    )(AdvancedInfo.apply)(AdvancedInfo.unapply)
  )
)

答案 1 :(得分: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)
}