在折叠调用中验证失败时如何访问我的表单属性?

How to access my forms properties when validation fails in the fold call?

我有一个动作,我的表格 posts 太像了:

def update() = Action { implicit request =>
  userForm.bindFromRequest().fold(
     errorForm => {
        if(errorForm.get.isDefined) {
           val id = errorForm.get.id // runtime error during form post
        }
        BadRequest(views.html.users.update(errorForm))
     },
     form => {
         val id = form.id   // works fine!
         Ok("this works fine" + form.name)
     }
  )

}

当我执行上述操作时,出现错误:

[NoSuchElementException: None.get]

如果没有验证错误,表单 post 在折叠调用的 'success' 部分工作得很好。

我需要在错误部分获取 id 值,我该怎么做?

Form 无法绑定到模型时,您所能获得的只是 Map[String, String] 形式的数据和验证错误(本质上)。因此您可以访问 Strings 的值,但请记住它们也可能不可用。

例如:

case class Test(id: Int, name: String)

val testForm = Form {
    mapping(
        "id" -> number,
        "name" -> nonEmptyText
    )(Test.apply)(Test.unapply)
}

现在尝试绑定到缺少 name 字段的 Form

scala> val errorForm = testForm.bind(Map("id" -> "1"))
errorForm: play.api.data.Form[Test] = Form(ObjectMapping2(<function2>,<function1>,(id,FieldMapping(,List())),(name,FieldMapping(,List(Constraint(Some(constraint.required),WrappedArray())))),,List()),Map(id -> 1),List(FormError(name,List(error.required),List())),None)

您可以使用 apply 访问各个字段。每个 Field 都有一个 value 方法 returns Option[String].

scala> errorForm("name").value
res4: Option[String] = None

scala> errorForm("id").value
res5: Option[String] = Some(1)

可能的用法:

errorForm("name").value map { name =>
    println("There was an error, but name = " + name)
} getOrElse {
    println("name field is missing")
}

请记住,非绑定数据只是一个 String,因此更复杂的数据结构可能更难访问,而且大多数时候它不是类型安全的。

另一种方法是直接访问原始 Map

scala> errorForm.data
res6: Map[String,String] = Map(id -> 1)