Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms 重头戏2:将表单绑定到列表[模型]的惯用方法_Forms_Scala_Binding_Collections_Playframework 2.0 - Fatal编程技术网

Forms 重头戏2:将表单绑定到列表[模型]的惯用方法

Forms 重头戏2:将表单绑定到列表[模型]的惯用方法,forms,scala,binding,collections,playframework-2.0,Forms,Scala,Binding,Collections,Playframework 2.0,我有几个CRUD操作要执行,每个操作都在一组模型上执行(例如,比赛时间表、球队名单、比赛结果、比赛统计等) 到目前为止,在我的游戏经验中(仅几个月,1个项目处于活动状态),我一直在使用绑定到模型实例的一对一表单 我知道我可以对表单字段名进行数字索引,但是如何将发布的表单绑定到列表[模型] 这就是我的一对一绑定的外观: // abstract away bindFromRequest to make binding more concise in controllers def bindForm[

我有几个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(_))
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 )
}
然后在控制器中:

val result = for {
  model <- bindForm(form).right
  id    <- dao.create(model) as json
} yield id
使用<代码>列表(gameDate),列表(gameType)则意味着表单绑定将返回一个组合实例,其属性都是集合——也许它可以工作,但看起来不像使用模型实例集合那样干净/直接


思想受到赞赏;-)

@Julien Richard Foy在play google group上向我指出了游戏表单映射中尚未记录的
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")
...
}

我不确定我是否完全理解你的问题。您想要一个有共同位置、团队1、团队2但有不同游戏日期和游戏类型的表单吗?或者你想要一个有多个游戏时间表的表单?多个foo,请参阅答案,Play支持这个,只是还没有文档记录,AFAIK,in-Play wiki。。。