我的应用程序包含18个字段的大表单。它使用标准表单映射进行处理,如下所示:
val bigForm = Form(
mapping(
"id" -> of[ObjectId],
"title" -> text,
// And another 16 fields...
...
)
)
一切都很顺利,但今天我决定又添加一个字段,问题就出现了 - mapping
无法超过18个参数。
那我该怎么办?我想将一些字段组合到结构中,但是额外的结构需要额外的格式化程序,JSON序列化器和解串器,工作量太大。我正在寻找一个通用的解决方案,未来可能会出现更多的领域。
我正在考虑的另一个解决方案是手动处理表单,而不是Form
。
有更好的解决方案吗?
答案 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)
}