Какая связь между validate () и hasErrors () - PullRequest
8 голосов
/ 28 декабря 2010

Этот вопрос возникает из проблемы другого вопроса моего.В этом вопросе я сталкиваюсь с ситуацией, когда функция hasErrors() не работает для класса непостоянных доменов , даже после всего, что я делал, следуя инструкции , часть 7.5..

Следуя пути Виктора, я исправил проблему, вызвав validate (), но я не понимаю, почему это работает.Документы Grails, похоже, ничего не говорят о том, что вы должны вызывать validate () перед функцией hasErrors ().Как это могло произойти?

1 Ответ

9 голосов
/ 28 декабря 2010

Для меня имеет смысл, что validate нужно будет вызвать, прежде чем спрашивать у объекта, является ли он hasErrors (или save для надлежащих доменных объектов, который вызывает validate под прикрытием). Проверить в этом контексте означает «проверить, является ли этот объект допустимым, и указать на наличие ошибок, если нет».

В качестве альтернативы реализация GORM должна будет вызывать validate каждый раз, когда в объект вносятся какие-либо изменения, что для меня было бы менее желательным поведением, поскольку это может включать в себя много работы, выполняемой часто и излишне (некоторые из этих ограничений может потребовать много работы).

В начале раздела 7.2 довольно четко сказано: «Для проверки класса домена вы можете вызвать метод validate в любом случае». В нем также говорится, что «в Grails, по сути, есть 2 этапа проверки, первый этап - это привязка данных, которая происходит, когда вы привязываете параметры запроса к экземпляру, например ... В этот момент у вас уже могут быть ошибки в свойстве ошибок из-за преобразование типов (например, преобразование строк в даты). Вы можете проверить их и получить исходное входное значение с помощью API ошибок. ... Второй этап проверки происходит при вызове проверки или сохранения. Именно тогда Grails будет проверять границу значения снова возвращает ограничения, которые вы определили. "

Документация для hasErrors также упоминает об этом. Вы можете получить к нему доступ, найдя вызов метода в рамке навигации слева, когда находитесь на сайте документации . Я всегда рекомендовал бы ознакомиться с этими и более описательными страницами руководства пользователя, поскольку они часто дают немного больше деталей. Вот страница для validate метода тоже.

У меня никогда не было проблем с непосредственным вызовом validate - это очень ясно для меня, и я могу выбрать момент, когда вся работа будет выполнена, и я готов к проверке. Я не вижу возможности изменить это поведение где-либо, но если вы хотите, чтобы validate вызывался автоматически или при определенных условиях, вы могли бы использовать магию метапрограммирования Groovy, добавив invokeMethod в класс и получить его. Позвоните validate, прежде чем переходить на определенные вызовы. Посмотрите здесь и здесь . (Не уверен, что я рекомендовал бы это, хотя! И имейте в виду, что ваш класс теперь будет зависеть от того, будет ли он использоваться в рамках валидации GORM, так как этот метод validate в противном случае может не существовать).

...