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

时间:2016-01-31 19:04:38

标签: scala playframework playframework-2.4

我在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)
}

我知道withError类的Form方法,但它只需要一个FormError参数:

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

我觉得必须有一个简单的解决方案(地图,对......?),但我无法弄明白。

val formWithErrors = ...

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

在行动中,而不是:

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

<body>  
    <div id="result"></div> 
</body>  
<script>  
    var result = document.getElementById("result")l
    if(typeof(EventSource) !== "undefined") {  
        var source = new EventSource("sse.php");  
        source.onmessage = function(event) {  
            result.innerHTML += event.data + "<br>";  
        };  
    } else {  
        result.innerHTML = "Sorry, your browser does not support sse";  
    }  
</script>