在折叠调用中验证失败时如何访问我的表单属性?
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]
形式的数据和验证错误(本质上)。因此您可以访问 String
s 的值,但请记住它们也可能不可用。
例如:
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)
我有一个动作,我的表格 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]
形式的数据和验证错误(本质上)。因此您可以访问 String
s 的值,但请记住它们也可能不可用。
例如:
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)