Как сохранить значение составного поля в Grails GSP? - PullRequest
1 голос
/ 23 января 2010

У меня есть составной доменный объект следующим образом:

class Person 
{
    static embedded = ['forSale']
    Boolean isSelling
    House forSale
}

class House 
{
    Integer numBedrooms
}

У меня есть выбор элемента управления для numBedrooms следующим образом:

<tr class="prop">
 <td valign="top" class="name">
   <label for="numBedrooms"><g:message code="person.numBedrooms.label" default="Num Bedrooms" /></label>
 </td>
 <td valign="top" class="value ${hasErrors(bean: personInstance, field: 'forSale.numBedrooms', 'errors')}">
     <g:select name="numBedrooms" value="${fieldValue(bean: personInstance, field: 'forSale.numBedrooms')}" 
          noSelection="${['null':'Select a number...']}"
      from="${1..6}"
     />
 </td>
</tr>

Обратите внимание, что я использую forSale.numBedrooms в поле Value на select. Я не смог создать скаффолдинг-код для этого, чтобы взглянуть на то, как это должно быть сделано, потому что представление create, генерируемое create-views, не содержит ссылок на поля в объекте forSale House.

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

Я отправляю значение numBedrooms обратно как часть строки запроса URl ...

& numBedrooms = 2

Когда я делаю это, код сохранения в моем контроллере молча терпит неудачу - по крайней мере, ничего никогда не записывается в базу данных. Я включил ведение журнала отладки для почти всего, но я не получаю сообщений в журнале, которые предполагают, что что-то не так, хотя что-то, очевидно, так.

Если я удаляю параметр numBedrooms из строки запроса, то мое сохранение выполняется как обычно, поэтому я предполагаю, что это как-то связано с разрешением numBedrooms.

Любая подсказка, что я делаю неправильно и что я могу сделать, чтобы отследить мою проблему?

1 Ответ

0 голосов
/ 25 января 2010

Я делаю generate-all для домена House, затем копирую и вставляю код GSP и удаляю файлы, как только я закончу. Я также обнаружил, что более разумно создавать шаблоны для редактирования домена House в том случае, если позже я использую домен House.

Для вашего GSP вам нужно что-то вроде этого (обратите внимание на атрибут name)

<tr class="prop">
 <td valign="top" class="name">
   <label for="forSale.numBedrooms"><g:message code="house.numBedrooms.label" default="Num Bedrooms" /></label>
 </td>
 <td valign="top" class="value ${hasErrors(bean: personInstance.forSale, field: 'numBedrooms', 'errors')}">
     <g:select name="forSale.numBedrooms" value="${fieldValue(bean: personInstance.forSale, field: 'numBedrooms')}" 
          noSelection="${['null':'Select a number...']}"
      from="${1..6}"
     />
 </td>
</tr>

В вашей строке параметров вам нужно *forSale*.numBedrooms=2. этот код будет работать с person.properties = params или new Person(params).

Встроенная «инструкция» только говорит Hibernate включить параметры в ту же таблицу, поскольку они все еще являются отдельными классами домена. Вероятно, он сгенерирует таблицу для домена, даже если вы никогда ее не используете.

Надеюсь, это поможет.

...