Grails 2.3.4 сгенерировал валидацию скаффолдинга

Я пытаюсь понять, как сгенерированные в 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.save, как это предлагается в документации. Однако, похоже, это работает. Итак, как этот метод проверяет и возвращает обратно в представление, если есть нарушения ограничений?

Что еще более важно, не должны ли мы использовать сгенерированные контроллеры лесов в качестве наилучшего способа выполнения базового CRUD в Grails?


person bholl    schedule 08.01.2014    source источник


Ответы (1)


Когда вы включаете параметры в методы действий контроллера, Grails выполняет для них привязку данных. Для простых типов, таких как строки, числа, логические значения и т. д., имя параметра сопоставляется с именами параметров, и если есть совпадение и разумный способ преобразования строки параметра в запрошенный тип, это делается за вас.

Для сложных типов параметр обрабатывается как объект команды. Если он определен в классе контроллера, он становится доступным для проверки во время компиляции посредством преобразования AST. Если класс определен в другом месте (например, src/groovy), он должен быть аннотирован аннотацией grails.validation.Validateable, а если это доменный класс, то он, очевидно, подлежит проверке. В любом случае, после создания экземпляра и привязки данных для вас вызывается функция validate().

person Burt Beckwith    schedule 08.01.2014
comment
Как всегда спасибо за объяснение, Берт. Я не знал, что сложные типы обрабатываются как объекты Command. После вашего объяснения я вернулся к документации по привязке данных и нашел это: существует 2 категории аргументов действия контроллера. Первая категория — это командные объекты. Что затем привело меня к команде: перед выполнением действия контроллера Grails автоматически создаст экземпляр класса объекта команды и заполнит его свойства, привязав параметры запроса. Если класс объекта команды помечен как Validateable, то объект команды будет проверен. - person bholl; 08.01.2014