玩2:惯用的方法来结合形式列出[模型](Play 2: idiomatic approach to

2019-09-23 06:03发布

我有几个CRUD操作执行,每一个上的模型的集合(如比赛日程,球队花名册,比赛结果,技术统计数据,等等)。

最多在我玩的经验,这一点(仅仅几个月,1个项目现场),我一直与一个一对一的形式绑定到模型实例。

我知道我可以用数字指标表单字段名称,但随后如何绑定张贴的形式列出[产品型号]?

这是我的一个一对一绑定的样子:

// 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

我想要做的是一样的,但不是模型绑定在成功时返回一个单一的模式,有它返回一个列表[产品型号],并传递到重载DAO创建/编辑/删除操作。

我看到有一个list ,一个可以作为一种形式映射的一部分使用的方法,但我有一种感觉,这将肆虐我的JDBC查询包装(ScalaQuery /油滑),其案例类/伴侣对象映射可能不会随着收藏品的特性发挥出色。

举例来说,比赛日程的现有映射是这样的:

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) ,而不是那么意味着形式结合会返回一个复合实例,它的属性是所有集合-也许它会工作,但似乎并没有几乎一样干净/简单与集合工作模型实例。

想法表示赞赏;-)

Answer 1:

在尚未证明seq()在比赛形式映射选项是向我指出在谷歌播放GROUP BY @Julien理查德·富瓦

使用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")
...
}


文章来源: Play 2: idiomatic approach to binding a form to List[Model]