grails为hasErrors添加验证错误

时间:2015-07-30 19:28:46

标签: grails groovy

我想知道如何向hasErrors方法添加自定义错误,以便gsp获取错误。我的代码到目前为止。

def recoverySetup = new RecoverySetup(params)

def onesolOrgkey = OnesolOrgkeyInfo.get(new OnesolOrgkeyInfo(params));

if(onesolOrgkey != null) {
    recoverySetup.setOneSolOrgkey(onesolOrgkey)
} else {
    recoverySetup.errors.reject('orgkey', 'You must provide a valid Org Key')
}

recoverySetup.validate()

if(recoverySetup.hasErrors()) {
    render view: 'create', model: [recoverySetupInstance: recoverySetup]
    return
}

3 个答案:

答案 0 :(得分:4)

正如Danilo所说,您可能希望为您的域类添加一个约束来为您执行此操作。

详细了解http://grails.github.io/grails-doc/2.2.x/guide/single.html#constraintshttp://grails.github.io/grails-doc/2.2.x/ref/Constraints/Usage.html中的约束。

如果出于某种原因你真的想要添加一个约束无法涵盖的自定义错误(我现在无法想象一个案例,但这并不意味着它不存在:-),你仍然可以用与你发布的非常相似的方式来做到这一点:

instance.errors.rejectValue(fieldName, errorCode, message, defaultMessage)
instance.errors.reject(errorCode, message, defaultMessage)

第一个拒绝具体的字段,第二个拒绝一般的bean。但请记住当您再次调用validate 时,将重置此错误。

此外,您可以使用以下命令在grails中自动显示bean的错误:

<g:hasErrors bean="${instance}">
   <g:renderErrors bean="${instance}" />
</g:hasErrors>

查看此处的所有选项:https://grails.github.io/grails-doc/2.2.x/ref/Tags/hasErrors.html

答案 1 :(得分:2)

您的域类可能如下所示:

class RecoverySetup {
    String someField
    static hasOne = [oneSolOrgkey: OneSolOrgkey]

    static constraints = {
        oneSolOrgkey nullable: false
    }
}

这样您就声明RecoverySetup的每个实例仅在定义oneSolOrgkey时才有效。

一旦有了RecoverySetup的实例,你可以通过调用返回布尔值的validate()方法检查它是否有效:

if (recoverySetupInstance.validate()) {
    // do something with a valid object
}
else {
    recoverySetupInstance.errors.allErrors.each {err ->
        println err // Print errors
    }
}

如果您将实例传递给视图,您将在recoverySetupInstance.errors中显示所有错误,并且您可以根据需要显示错误。

答案 2 :(得分:0)

您的问题我想知道如何向hasErrors方法添加自定义错误,以便gsp提取错误有点封闭,因为它专门提到了 hasErrors 是您要执行的操作。

另一种更简单的方法是在返回gsp之前在控制器中创建一条Flash消息

flash.error = 'You must provide a valid Org Key'
render view: 'create', model: [recoverySetupInstance: recoverySetup]
return

然后在您的gsp中显示一个代码块,以显示 flash.error ...

<g:if test="${flash.error}">
<div class="errors" role="status">${flash.error}</div>
</g:if>

这对于那些您不一定要构建到对象中的业务规则验证非常有效,例如当我想防止用户不小心将重复项添加到可以在其他情况下允许重复项的表中时,使用了此方法。