Обработка ошибок в Grails: привязки объектов 1: 1 - PullRequest
1 голос
/ 01 мая 2011

У меня есть форма регистрации, которая содержит поля, относящиеся к двум объектам домена;Пользователь и профиль.Это соотношение 1: 1, принадлежащее классу домена User.

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

Однако на практике при сбое проверки сбойные значения не отображаются в представлении.Ниже приведен код для действия с регистром:

def registration = {

}

def register = {
    def user = new User()
    bindData(user, params)
    if (user.save()) {
        flash.message = 'Successfully Registered User'
        redirect(uri: '/')
    }else {
        flash.message = 'Registration Failed!'
        redirect(action: registration, params: [ user: user ])
    }
}

Ниже приведен пример html-выдержки из представления, отображающего поля, связанные с пользователем и профилем:

<div class="row">
<label for="city"> City, State: </label>
<g:textField id="city" name="profile.city"
    value="${user?.profile?.city}" size="28" />
<span class="red">*</span>
</div>  
<hr />  
<div class="row">
<label for="email"> E-mail address: </label>
<g:textField id="email" name="userId" value="${user?.userId}" size="28" />
<span class="red">*</span>
</div>

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

Любые комментарии или предложения будут оценены.

Спасибо, Том

Ответы [ 3 ]

0 голосов
/ 01 мая 2011

Вам нужно каким-то образом передать отправленные значения от user в действии register до user в действии registration.Как это:

if (params.user) {
  user.properties = params.user.properties
}
0 голосов
/ 02 мая 2011

Попробуйте явно вызвать erorr?

Я использовал этот шаблон для перенаправления обратно в ту же форму.

if (user.save()) {
...
} else {
    return error()
}

Обычно я использую объекты команд в веб-потоках, поэтому мой обычный шаблон выглядиткак:

def registerFlow = {
    registerPage = {
        on("submit") { FormDataCommand cmd ->
            cmd.validate()
            if (cmd.hasErrors()) {
               flow.cmd = cmd
               return error()
            } else {
               ...
            }
        }
    }
}

class FormDataCommand implements Serializable {
    User u
    Profile p

    static constraints = {
        u(validator: { it.validate() })
        p(validator: { it.validate() })
    }  

}
0 голосов
/ 01 мая 2011

Если я правильно помню, я думал, что это было что-то вроде:

def user = new User()
user.properties = params
...