我们在父对象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),但这是用户组请求的内容。我目前正在推动这样做更正确。
答案 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>