gpt4 book ai didi

forms - Play 2 : idiomatic approach to binding a form to List[Model]

转载 作者:行者123 更新时间:2023-12-01 10:07:34 25 4
gpt4 key购买 nike

我有几个 CRUD 操作要执行,每个操作都基于一组模型(例如比赛时间表、球队花名册、比赛结果、比赛统计数据等)。

到目前为止,在我的 Play 体验中(仅仅几个月,1 个项目上线)我一直在使用一对一的表单绑定(bind)到模型实例。

我知道我可以用数字索引表单字段名称,但是如何将发布的表单绑定(bind)到 List[Model]?

这是我的一对一绑定(bind)的样子:

// 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(_))

然后在 Controller 中:

val result = for {
model <- bindForm(form).right
id <- dao.create(model) as json
} yield id

我想做的是相同的,但不是模型绑定(bind)在成功时返回单个模型,而是让它返回一个 List[Model],然后传递给重载的 DAO 创建/编辑/删除操作。

我看到有一个 list 方法可以用作 Form 映射的一部分,但我觉得这会对我的 JDBC 查询包装器 (ScalaQuery/Slick) 造成严重破坏,其案例类/伴随对象映射可能无法很好地处理集合属性。

例如,游戏时间表的现有映射如下所示:

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) 代替意味着表单绑定(bind)将返回一个 Composite 实例,其属性都是集合——也许它会起作用,但似乎不太可能与使用模型实例集合一样干净/直接。

赞赏的想法 ;-)

最佳答案

@Julien Richard-Foy 在 Play google group 上向我指出了游戏形式映射中尚未记录的 seq() 选项

同时使用 repeat()seq() 可以重复表单映射,从而创建索引 foo.bar[n] 表单域元素的集合。

例子

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 )
}

然后在 View 中:

@repeat(_form("composite"), min=@numGames) { f=>
@inputDate(f("gameDate"), '_label-> "Game Date", 'class-> "required")
...
}

关于forms - Play 2 : idiomatic approach to binding a form to List[Model],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12662653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com