validation - Grails验证错误为Set或无重复

标签 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']
                }
            }

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

就目前而言,如果用户创建使用相同SpecialCategory ID且未选择适当的Initiative的多个Contribution,则可能多次看到相同的错误消息。验证消息可以设置吗?还是我必须遍历所有错误并尝试删除重复数据(毛额)?

有更好的方法来处理此问题(例如,当未选择“特定计划”时,不在选择中显示某些SpecialCategories),但这是用户组所要求的。我目前正在努力以更正确的方式进行操作。

最佳答案

我必须在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>

关于validation - Grails验证错误为Set或无重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31252292/

相关文章:

c# - 十进制值对价格无效。 MVC3

grails - Grails:编辑和删除链接不起作用

java - 错误org.grails.orm.hibernate.cfg.HibernateMappingBuilder-ORM映射无效等

sql - 表中非连续行之间的 Datediff

arrays - 制作 uniq 数组最快的方法是什么?

php - Laravel - 文件需要验证反之亦然

scalaz:如何处理验证中的不同错误类型?

ruby-on-rails - ActiveRecord bool 验证接受非 bool 值

r - 仅当重复值出现在第一个采样周期时才保留它们

facebook - Grails Facebook 插件 - 如何处理无效用户