Визуализация ошибок проверки команд через редирект - PullRequest
7 голосов
/ 16 августа 2011

Я не могу отобразить ошибки из моего командного объекта.Он хорошо работает, но мой .gsp не отображает ошибки, которые я поднимаю.

Вот мое действие контроллера:

def handleModifyProfile2 = { CreditProviderModificationCommand cpmc -> // bind params to the command object
   if (cpmc.hasErrors()) {
      flash.message = "Error modifying your profile:"
      redirect(action: "modifyProfile", params: [creditProvider : cpmc])
   } ...

Вот как я пытаюсь отобразить ошибки в моем представлении .gsp:

<g:hasErrors bean="${creditProvider}">
   <div class="errors">
       <g:renderErrors bean="${creditProvider}" as="list" />
   </div>
</g:hasErrors>

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

Ответы [ 2 ]

9 голосов
/ 16 августа 2011

Вы не можете отправить команду через редирект, используя params.У вас есть пара вариантов:

  • render() в состоянии ошибки вместо redirect() ing:

    if(cpmc.hasErrors()) {
        render(view: 'profile', model: [creditProvider: cpmc])
    }
    

    Это наиболее распространенная идиома того, что вывы делаете.

  • Сохраните команду в сеансе, чтобы сохранить ее при перенаправлении:

    if(cpmc.hasErrors()) {
        session.cpmc = cpmc
        redirect(...)
    }
    
    // and in your action
    def cpmc = session.cpmc ?: null
    render(view: 'profile', model: [creditProvider: cpmc])
    

    Этот параметр несколько сомнителен.Если все сделано неправильно, вы можете загрязнить сессию и оставить объекты висящими вокруг, занимая память.Тем не менее, если все сделано правильно, это может быть хорошим способом реализовать post-redirect-get.

0 голосов
/ 17 мая 2019

С Grails 3 (я не знаю, сработало ли это раньше) для этого можно использовать вспышку .Согласно документации, флэш-память будет «очищена в конце следующего запроса».

Мне нравится использовать такой шаблон:

def save(MyDomain myDomain) {
    if (myDomain.validate()) {
        myDomain.save()
    } else {
        flash.errors = myDomain.errors
    }
    redirect(action: 'edit', id: myDomain.id)
}

def edit(MyDomain myDomain) {
    if (flash.errors) {
        myDomain.errors = (Errors) flash.errors
    }
    return [myDomain: myDomain]
}

Мне не нравитсяиспользуйте render() для такого рода обработки ошибок, поскольку это делает URL-адреса, отображаемые в браузере, несовместимыми с отображаемой страницей.Это нарушается, когда пользователи устанавливают закладки, например.

...