我有几个CRUD操作要执行,每个操作都在一组模型上(例如游戏时间表,团队名单,游戏结果,游戏统计数据等)。
到目前为止,我的Play体验(仅仅几个月,1个项目现场直播)我一直在使用一对一的表单绑定到模型实例。
我知道我可以用数字索引表单字段名称,但是如何将发布的表单绑定到List [Model]?
这就是我的一对一绑定:
// abstract away bindFromRequest to make binding more concise in controllers
def bindForm[T](f: play.api.data.Form[T])(implicit r: play.api.mvc.Request[_]) =
f.bindFromRequest fold(e=> Left(e.errorsAsJson), Right(_))
然后在控制器中:
val result = for {
model <- bindForm(form).right
id <- dao.create(model) as json
} yield id
我想要做的是相同的,但不是模型绑定在成功时返回单个模型,而是返回List [Model],并传递给重载的DAO创建/编辑/删除操作。
我看到有一个list
方法可以用作Form映射的一部分,但我觉得这会对我的JDBC查询包装器(ScalaQuery / Slick)造成严重破坏,其案例类/ companion对象映射可能不适合集合属性。
例如,游戏时间表的现有映射如下所示:
object CompositeForm {
import play.api.data.{Form, Forms}, Forms._
import utils.Validator.Bindings.jodaLocalTimeFormat
val mapper = mapping(
'id -> ignored(0),
'gameDate -> jodaDate,
'gameType -> optional(text),
'location -> optional(text),
'team1 -> number,
'team2 -> number
)(Composite.apply)(Composite.unapply)
val form = Form( mapper )
}
使用list(gameDate), list(gameType)
代替表示表单绑定将返回一个复合实例,其属性是所有集合 - 也许它可以工作,但似乎不像使用模型集合一样干净/直接实例
赞赏的想法; - )
答案 0 :(得分:1)
@Julien Richard-Foy在Play google小组中向我指出了游戏形式映射中尚未记录的seq()
选项
同时使用repeat()
和seq()
可以重复表单映射,从而创建索引的foo.bar [n] formfield元素的集合。
实施例
object ScheduleForm {
import play.api.data.{Form, Forms}, Forms._
val mapper = mapping(
'composite -> seq(CompositeForm.mapper),
'note -> seq(ScheduleNoteForm.mapper)
)(Schedule.apply)(Schedule.unapply)
val form = Form( mapper )
}
然后在视图中:
@repeat(_form("composite"), min=@numGames) { f=>
@inputDate(f("gameDate"), '_label-> "Game Date", 'class-> "required")
...
}