Grails 2.3.4 проверка сгенерированных строительных лесов
-
20-12-2019 - |
Вопрос
Я пытаюсь понять, как методы scaffolding, сгенерированные Grails 2.3.4, выполняют проверку.Например, это то, что было сгенерировано для моего метода сохранения домена Club:
def save(Club clubInstance) {
if (clubInstance == null) {
notFound()
return
}
if (clubInstance.hasErrors()) {
respond clubInstance.errors, view:'create'
return
}
clubInstance.save flush:true
request.withFormat {
form {
flash.message = message(code: 'default.created.message', args: [message(code: 'clubInstance.label', default: 'Club'), clubInstance.id])
redirect clubInstance
}
'*' { respond clubInstance, [status: CREATED] }
}
}
Насколько я понимаю, первый этап проверки произошел при привязке данных к параметру Club clubinstance действия сохранения.Таким образом, любые ошибки привязки данных будут отлавливаться в if (clubInstance.hasErrors()).
Я не вижу явного вызова clubInstance.validate() или какой-либо проверки ошибок в clubInstance.сохранить, как указано в документации.Однако, похоже, это работает.Итак, как этот метод проверяет и возвращает обратно к представлению, если есть нарушения ограничений?
Что еще более важно, не должны ли мы использовать сгенерированные контроллеры scaffolding в качестве наилучшего практического способа выполнения базового CRUD в Grails?
Решение
Когда вы включаете параметры в методы действия контроллера, Grails выполнит привязку данных для них.Для простых типов, таких как строки, числа, логическое значение и т.д.имя параметра сопоставляется с именами параметров, и если есть совпадение и разумный способ преобразовать строку параметра в запрашиваемый тип, это сделано за вас.
Для сложных типов параметр обрабатывается как командный объект.Если он определен в классе controller, он становится доступным для проверки во время компиляции с помощью преобразования AST.Если класс определен в другом месте (напримерsrc/groovy) он должен быть снабжен комментариями с grails.validation.Validateable
аннотация, и если это класс домена, то он, очевидно, поддается проверке.В любом случае, после создания экземпляра и привязки к данным для вас вызывается функция validate().