代码之家  ›  专栏  ›  技术社区  ›  Nick

手动将Seq[FormError]添加到Play 2.4(Scala)中的表单

  •  1
  • Nick  · 技术社区  · 9 年前

    我有一个正常人 play.api.data.Form 在Play Framework 2.4中。我在我的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)
    }
    

    我知道 withError 方法 Form 上课,但只需要一次 FormError 参数:

    def withError(error: FormError): Form[T] = this.copy(errors = errors :+ error, value = None)
    

    我觉得必须有一个简单的解决方案(地图,为了…?),但我想不通。

    val formWithErrors = ...
    

    谢谢你的帮助!

    1 回复  |  直到 9 年前
        1
  •  0
  •   Nick    9 年前

    在操作中,而不是:

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