hasErrors с индексированным свойством
Мне трудно заставить hasErrors работать с индексированными свойствами. Например
class Order {
String prop1
String prop2
static hasMany = [items: Item]
}
class Item {
String name
static constraints = {
name(blank:false)
}
}
Проверка работает правильно, и при пустом item.name я получаю сообщение об ошибке с
<g:renderErrors bean="${orderInstance}"/>
Тем не менее, я пытаюсь выделить поле ввода с помощью hasErrors:
<g:each in="${orderIntsance.items}" status="i" var="item">
<span class="field ${hasErrors(bean: orderInstance, field: ????????? , 'errors')}">
<g:textField name="items[${i}].name" value="${item?.name}"/>
</span>
</g:each>
Не знаете, как добраться до него с помощью поля: собственность, какие-либо идеи?
Спасибо
2 ответа
Нашел его, получил возможность реализовать собственный валидатор на странице документации Grails Validation (duh):
"В некоторых ситуациях (необычные ситуации) может потребоваться знать, как перенести ошибку из вложенного дочернего объекта в объект родительского домена. В некоторых случаях, если вы проверяете дочерние объекты перед родительским объектом, ошибки на дочерние объекты будут сброшены до того, как объект будет отправлен в JSP. " ( http://www.grails.org/Validation)
static constraints = {
children( nullable:true, validator: {val, obj, errors ->
def errorFound = false;
val.each{ child ->
if(!child .validate()){
errorFound = true;
child .errors.allErrors.each{ error->
obj.errors.rejectValue('children', "parent.child.invalid",
[child, error.getField(), error.getRejectedValue()] as Object[],
"For source [${child}],
field [${error.getField()}] with value [${error.getRejectedValue()}] is invalid.")
}
}
}
if(errorFound) return false;
})
}
У меня было подобное требование, и я попробовал следующий способ, и это сработало. Просто хотел поделиться этим
${hasErrors(bean: orderInstance, field: 'items['+ i +'].name', 'errors')