Grails использует Command Object и объект в одном GSP

У меня есть контроллер, способ редактирования рисует информацию о пользователе в файле формы. Но когда я пытаюсь выполнить обновление с ошибками, командный объект возвращает объект userCommand, поэтому я потерял всю информацию из пользовательского объекта.

Есть ли способ использовать оба в одной форме? или что мне здесь не хватает.

Класс UserController

class UserController {
    def edit(User user) {
        respond user
    }
    def update(UserCommand userCommand) {
        log.debug "Update a User"

        if (userCommand.hasErrors()) {
            respond userCommand.errors, view: 'edit'
            return
        }
     }
}

_form.gsp файл

<g:form action="update">
    <div class="form-group">
        <label for="firstName">User First Name</label>
        <input class="form-control" name="firstName" value="${user?.firstName}">
    </div>

    <div class="form-group">
        <label for="lastName">User Last Name</label>
        <input class="form-control" name="lastName" value="${user?.lastName}">
    </div>
</g:form>

при вызове метода редактирования я получаю информацию о пользователе

Обновление с ошибками, я потерял информацию о пользователе

2 ответа

Решение

Спасибо @tuomas-valtonen. Вы водите меня, чтобы найти решение.

def edit(User user) {
        UserCommand userCommand = new UserCommand()
        bindData(userCommand, user)
        respond userCommand
    }

Вы должны использовать UserCommand на оба параметра действий и создать свой пользовательский объект внутри действия из UserCommand с помощью data binding, Это должно отделить вашу модель представления от фактической модели.

Как и другие заявленные пользователи, вернуть все UserCommand вместо UserCommand.errors, Вы можете получить доступ UserCommand.errors в представлении также.

Помните, что после того, как ваша UserCommand действительна, вам все равно нужно создать пользователя, проверить его и вернуть все ошибки, которые у него есть. Оба могут быть запущены <g:renderErrors bean="${user}"> например.

Другие вопросы по тегам