【问题标题】:Play forms: how to fill a repeated field?播放表格:如何填写重复的字段?
【发布时间】:2013-06-18 19:51:18
【问题描述】:

我有一个包含重复字段的表单:

case class MyForm(topics: List[Int])
val myForm: Form[MyForm] = Form(
  mapping(
    "topics" -> list(number)
  )(MyForm.apply _)(MyForm.unapply _)
)

以及对应的视图:

@form(...) {
  <h2>Topics of interest:</h2>
  @for(Topic(id, name, _) <- Topics.all) {
    @checkbox(
      bidForm(s"topics[$id]"),
      '_label -> (name + ":").capitalize,
      'value -> id.toString)
  }
  <input type="submit" id="submit" value="Save">
}

到目前为止一切顺利,如果该字段有错误,我会通过 myForm.bindFromRequest 重新渲染它。

我想用我的数据库中的数据预先填写表格。对于其他类型的字段(numbertextoption() 等),我可以使用以下内容填充 existingMyForm

val existingMyForm = myForm.fill(MyForm(
  // Queries the database and return a list of case classes with field id: Int
  Topics.of(member).map(_.id)
))

但是对于list,这种方法会失败,我必须手动进行映射:

val existingMyForm = myForm.bind(
  Topics.of(member).map(t => ("topics[%s]".format(t.id), t.id.toString)).toMap
)

有没有更好的方法来做到这一点?

【问题讨论】:

  • 我也有同样的问题!你修好了吗?如果是,如何?
  • 不,我还在用同样的hack :(

标签: forms scala playframework-2.0 playframework-2.1


【解决方案1】:

我相信您需要将 List[Int] 显式传递给 MyForm 构造函数,即

val existingMyForm = myForm.fill(MyForm(
    Topics.of(member).map(_.id).toList
))

编辑 - 这是我适用于 Play 2.1.1 Scala 的基本实现:

case class MyForm(topics: List[Int])
case class Topic(id: Int)
val myForm: Form[MyForm] = Form(
  mapping("topics" -> list(number))(MyForm.apply _)(MyForm.unapply _)
)

val topicList:List[Topic] = List(Topic(1), Topic(2), Topic(3))

def test = Action { implicit req =>
  val existingMyForm = myForm.fill(MyForm(
    topicList.map(_.id)
  ))
  Ok(views.html.test(existingMyForm))
}

【讨论】:

  • Topics.of 返回一个 List[Topic] 并且 Topic 有一个 id: Int 字段,所以 List[Int] 上的这个 .toList 不会改变任何东西。
  • 你是对的。请查看我的编辑,我唯一能想到的是 Topics.of 不返回列表。能不能看看Topics.of是怎么实现的?
  • 我之前的评论有Topics.of implementation的链接。
  • 我检查了你的项目,并用调用 Topics.of() 替换了我的人为列表。没有看到任何错误。您是否验证了即使是这个较小的示例也失败了?我注意到您的 hack 用于更大、更复杂的表单。
猜你喜欢
  • 1970-01-01
  • 2021-04-23
  • 2018-04-22
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多