Как создать несколько объектов домена со страницы GSP - PullRequest
0 голосов
/ 30 ноября 2011

У меня есть класс Person с двумя свойствами: name и address. Я хочу создать страницу GSP, которая позволяет одновременно создавать 10 пользователей. Вот как я это реализую, и мне было интересно, есть ли лучший способ:

Сначала создайте 20 текстовых полей на странице GSP - 10 с someperson.name и 10 с someperson.address именами полей (сделайте их в цикле или кодируйте их все по отдельности, не имеет значения).

Во-вторых, обработайте отправленные данные в контроллере. Объект someperson имеет отправленные данные, но в не очень приятной структуре ([name: ['Bob', 'John'], address: ['Address 1', 'Address 2']]), поэтому я вызываю transpose(), чтобы получить доступ к парам name, address.

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

Наконец, если проверка не пройдена (name не может быть null), сделайте что-нибудь ... пока не знаете что! Я подумываю о передаче коллекции Person объектов в GSP, где они повторяются с использованием цикла, и если hasErrors, то показывают их ... Не знаю, как выделить поля, которые не прошли проверку ...

Итак, есть ли лучший способ (вероятно, я должен спросить, ЧТО ТАКОЕ лучший способ)?

1 Ответ

1 голос
/ 30 ноября 2011

Вы должны использовать поддержку привязки данных Grails, объявив объект команды, подобный этому

class PersonCommand {

  List<Person> people = []
}

Если вы создаете свою форму так, чтобы параметры запроса были названы так:

person[0].name=bob
person[0].address=england
person[1].name=john
person[1].address=ireland

Данные будут автоматически привязаны к аргументу personCommand этого действия контроллера

class MyController {

  def savePeople = {PersonCommand personCommand->

  }
}

Если вы позвоните personCommand.validate(), это может в свою очередь вызвать validate() на каждом Person в people (я не уверен). Если это не так, вы можете сделать это самостоятельно, позвонив по номеру

boolean allPersonsValid = personCommand.people.every {it.validate()}

На этом этапе вы узнаете, все ли экземпляры Person действительны. Если это не так, вы должны передать PersonCommand обратно в GSP и использовать теги Grails:

  • <g:eachError>
  • <g:hasErrors>
  • <g:renderErrors>

для выделения полей с ошибками. Если вы не совсем уверены, как использовать эти теги для выделения, я предлагаю вам запустить grails generate-all для класса домена и посмотреть на генерируемый им код GSP.

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