手动将 Seq[FormError] 添加到 Play 2.4 (Scala) 中的表单
Manually add Seq[FormError] to a Form in Play 2.4 (Scala)
我在 Play Framework 2.4 中有一个正常的 play.api.data.Form
。我在我的 Action 中进行基本验证,但在我的情况下,即使用户提交的数据在语法上是正确的,我也可能必须根据外部服务的结果添加错误。
我从 JSON 对象中获取带有错误消息的错误字段,例如:
{
"name": [
"Invalid name"
],
"age": [
"Invalid age",
"Something else"
]
}
我可以将此 JSON 对象转换为 Seq[FormError]
:
val fields: Seq[(String, JsValue)] = jsObjErrorFields.fields
val formErrors: Seq[FormError] = fields map { case(key, jsValue) =>
val messages: Seq[String] = jsValue.asOpt[Seq[String]] getOrElse Seq()
FormError(key, messages)
}
我知道 Form
class 的 withError
方法,但它只需要一个 FormError
参数:
def withError(error: FormError): Form[T] = this.copy(errors = errors :+ error, value = None)
我觉得一定有一个简单的解决方案来解决这个问题(map,for...?),但我想不通。
val formWithErrors = ...
感谢您的帮助!
在行动中,而不是:
MyForm.bindFromRequest.fold( // ...
将表单实例保存在 val
然后 fold
:
val form = MyForm.bindFromRequest
form.fold( // ...
formWithErrors => { /* ... */ },
data => {
// ...
// Copy the form and apply the errors from JSON:
val formWithErrors = form.copy(errors = formErrors)
// ...
}
)
我在 Play Framework 2.4 中有一个正常的 play.api.data.Form
。我在我的 Action 中进行基本验证,但在我的情况下,即使用户提交的数据在语法上是正确的,我也可能必须根据外部服务的结果添加错误。
我从 JSON 对象中获取带有错误消息的错误字段,例如:
{
"name": [
"Invalid name"
],
"age": [
"Invalid age",
"Something else"
]
}
我可以将此 JSON 对象转换为 Seq[FormError]
:
val fields: Seq[(String, JsValue)] = jsObjErrorFields.fields
val formErrors: Seq[FormError] = fields map { case(key, jsValue) =>
val messages: Seq[String] = jsValue.asOpt[Seq[String]] getOrElse Seq()
FormError(key, messages)
}
我知道 Form
class 的 withError
方法,但它只需要一个 FormError
参数:
def withError(error: FormError): Form[T] = this.copy(errors = errors :+ error, value = None)
我觉得一定有一个简单的解决方案来解决这个问题(map,for...?),但我想不通。
val formWithErrors = ...
感谢您的帮助!
在行动中,而不是:
MyForm.bindFromRequest.fold( // ...
将表单实例保存在 val
然后 fold
:
val form = MyForm.bindFromRequest
form.fold( // ...
formWithErrors => { /* ... */ },
data => {
// ...
// Copy the form and apply the errors from JSON:
val formWithErrors = form.copy(errors = formErrors)
// ...
}
)