手动将 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)
        // ...
    }
)