Grails: отобразить страницу в beforeInterceptor - PullRequest
0 голосов
/ 19 февраля 2011

В одном из моих контроллеров я написал код проверки ошибок в закрытии beforeInterceptor.

 if (getUser()?.courses?.size() == 0) {
        render(view: '/base/errorMessage', model: [errorMessage: "You don't have any courses!"]);
        return false;
 }

Этот вызов рендеринга показывает красивую страницу ошибки всей программы.

Однако, если я верну false, ничего не отобразится! Если я верну true, страница с ошибкой отображается нормально, но действие все равно выполняется (оно не отображается, но логика все равно выполняется). Это требует повторной проверки ошибок, побеждая цель перехватчика.

Вызовы redirect () по-прежнему работают нормально, но перемещение отображения ошибок в другое действие является грязным. Вместо / app / courses пользователь увидит / app / error / errorMessage в своем URL, и можно сразу перейти прямо на страницу с ошибкой. Тогда возникает вопрос, как получить сообщение об этом действии - flash.message? session.var

Есть ли лучший способ?

Ответы [ 3 ]

0 голосов
/ 20 февраля 2011

Я предлагаю вам взглянуть на Grails URL Mapping, раздел 6.4.4 (сопоставление по коду ответа) : вы можете перенаправить ваш запрос на «страницу ошибок общего сервера 500»

static mappings = {
   "500"(controller:"errors", action:"serverError")
   "404"(controller:"errors", action:"notFound")
   "403"(controller:"errors", action:"forbidden")
}

Более того, я думаю, вы, возможно, не знаете, что можете изменить URL-адрес вашего контроллера / действия, что также упомянуто в ссылке выше.

0 голосов
/ 12 июня 2015

Я знаю, что это несколько лет, но я думаю, что вопрос все еще актуален.

Grails предоставил более удобный способ проверки ввода формы и возврата сообщений об ошибках флэш-памяти с помощью объектов объектов и i18n message.properties.

По сути, вам не нужно писать перехватчик.Вы создаете командный объект в вашем контроллере со всеми полями формы, которые вы ожидаете получить при отправке.Затем создайте ограничения проверки для каждого поля и создайте свои сообщения i18n для ошибок нарушения ограничений.

Теперь, когда вы определяете действие контроллера и вставляете объект команды в качестве параметра:

def someAction(MyCommandObject command) {}

Параметр объекта команды действует подобно beforeInterceptor, в котором Grails автоматически связывает данные из формы и отправляет соответствующие атрибуты объекта команды - но подождите!Это не все!Grails также применяет ограничения к данным из формы и по существу выполняет command.validate() all ДО любой код, выполняемый в действии.Вот почему это хорошая и общепринятая практика - проверять экземпляр объекта команды на наличие ошибок перед выполнением любого другого кода в вашем действии, например:

def someAction(MyCommandObject command) {
    if(command.hasErrors()){
        //do something -- set flash message error and redirect, etc.
    }
    //other importand code follows ...
}

Я надеюсь, что это поможет другим, кто может найти этот вопросСоответствующий.Это только один пример того, насколько полезными и мощными могут быть объекты команд.

0 голосов
/ 19 февраля 2011

Обновление: Фильтры , видимо, не страдают этой проблемой. Однако это требует отделения логики от контроллера. Не конец света.

Я оставлю вопрос на случай, если есть лучший способ, который я пропустил.

...