Проблемы с повторным отображением представления с правильными параметрами, когда пользователь оставляет поля формы пустыми - PullRequest
1 голос
/ 25 августа 2011

Я использую атрибут noSelection в теге <g:select> поля Account для моего Load create представления. Когда пользователь не делает выбор и нажимает кнопку «Создать», я ожидаю, что текущие значения всех полей формы будут переданы закрытию save в моем контроллере Load, который, в свою очередь, повторно вызывает create просмотреть и заполнить это представление с ранее упомянутыми текущими значениями. Это не происходит для двух полей формы, и мне неясно, почему.

Вот как выглядит Load create, вызываемый контроллером /truckingmanagement/load/create:

enter image description here

Если пользователь не делает выбор в поле Account и затем нажимает кнопку «Создать», загрузка, очевидно, не может быть создана. Вот как выглядит результирующее представление Load create, вызываемое контроллером /truckingmanagement/load/save:

enter image description here

Итак, у меня есть две проблемы, первая из которых заключается в том, что поле Logged By во втором представлении не заполняется значением, выбранным в первом представлении. Кроме того, раскрывающийся список полностью пуст, нет пользователей для выбора. Вторая проблема заключается в том, что раскрывающийся список Account полностью пуст, нет учетных записей для выбора.

Вот теги <g:select>, используемые для полей Logged By и Account в представлении Load create.

Logged By поле:

<g:select name="loggedBy.id" from="${loggedByUsers}" optionKey="id"  value="${loadInstance?.loggedBy?.id}" />

Account поле:

<g:select id="account" name="account.id" from="${accountsWithCargoDestinations}" optionKey="id" noSelection="['':'-Select-']" />

Вот закрытие create и save в моем LoadController:

def create = {
    Role role1 = Role.findByAuthority("ROLE_ADMIN")
    Role role2 = Role.findByAuthority("ROLE_OFFICE_PROFESSIONAL")
    Role role3 = Role.findByAuthority("ROLE_DRIVER")   
    def loggedByUsers = UserRole.findAllByRoleInList([role1, role2, role3]).user

    def loadInstance = new Load()
    loadInstance.properties = params

    def accountsWithCargoDestinations = Account.findAllByUserInList(Address.findAll("from Address as addresses where addresses.cargoDestination=true").user)

    return [loadInstance:loadInstance, loggedByUsers:loggedByUsers, accountsWithCargoDestinations:accountsWithCargoDestinations]
}

def save = {
    def loadInstance = new Load(params)
    if (loadInstance.save(flush: true)) {
        flash.message = "${message(code: 'default.created.message', args: [message(code: 'load.label', default: 'Load'), loadInstance.id])}"
        redirect(action: "show", id: loadInstance.id)
    }
    else {
        System.out.println params //Trying to see if any values from the problem fields got lost.
        render(view: "create", model: [loadInstance: loadInstance])
    }
}

Вы заметите в выражении println в части else моего закрытия save, которое печатает params. Когда я сделал это, я обнаружил, что значение, выбранное в поле Logged By в первом представлении, действительно было правильно передано от первого представления до этой точки правильно, но я не знаю, почему оно не отображается, когда Load create представление отображается в следующей строке кода или, по крайней мере, почему что-то (то есть loggedByUsers из контроллера truckingmanagement/load/create) не заполняет поле Logged By, когда представление оказано. Буду признателен за любую помощь, и извините за многословие.

1 Ответ

1 голос
/ 25 августа 2011

Чтобы ответить на ваш вопрос, заданный в комментарии, ответ.Возможно, вы захотите исследовать использование chain в вашем контроллере.Вам нужно будет немного переделать действие create, чтобы только создать экземпляр нового loadInstance, если он еще не представлен в модели.Однако это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...