Grails验证错误为Set或no duplicatelic

时间:2015-07-06 17:42:33

标签: validation grails unique

我们在父对象A和子B(贡献)之间存在一对多的关系。子对象中的字段取决于父对象中字段的特定选择。父级的保存是级联,因此父级和子级的所有验证消息都是同时发生的。

当验证错误发生时,多个子对象之间没有可用的区别(即没有名称。我们可以使用ID,但用户不希望在UI中看到ID,因此它将毫无意义)。如何删除子项的重复错误消息或将其设置为一组,以便只显示某种类型的消息?

Object A
    InitiativeType initiative
    static hasMany = [ contributions: Contribution ] 

Contribution
    SpecialCategory specialCategory

    static constraints = {
        specialCategory nullable: true, validator: { val, obj ->
                if ((val && val.id > 53 && val.id < 75) && !obj.A.initiative?.contains(5) ) { // special initiative
                    return ['specialValidation']
                }
            }

如果选择了某个倡议ID,则SpecialCategory中的某些ID才有效。否则,抛出验证错误,指出“特殊类别[ID]要求您选择Initiative [Required_Initiative_Name]”

就目前而言,如果用户创建多个使用相同SpecialCategory ID并且未选择相应Initiative的贡献,则可以多次查看相同的错误消息。验证消息可以设置吗?或者我是否必须遍历所有错误并尝试删除欺骗(粗略)?

有更好的方法来处理这种情况(例如,未选择“特定计划”时未在选择中显示某些SpecialCategories),但这是用户组请求的内容。我目前正在推动这样做更正确。

1 个答案:

答案 0 :(得分:0)

我不得不在我的GSP中分解我的错误输出块。这似乎工作正常:

<g:eachError var="err" bean="${A}">
    <g:if test="${err.code != 'specialValidation'}"> <!-- show message later to remove duplicates -->
        <g:message error="${err}" /><br />
    </g:if>
</g:eachError>
<g:if test="${A?.contributions?.errors?.size == 1}">
    A Contribution with a Special Category must also include the Special Initiative.
</g:if><g:elseif test="${A?.contributions?.errors?.size > 1}">
    Contributions with a Special Category must also include the Special Initiative. There are currently ${a?.contributions?.errors?.size} in error.
</g:elseif>