父对象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/