Как сохранить значение составного поля в Grails GSP?

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

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

class House 
{
    Integer numBedrooms
}

У меня есть select control для 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 в fieldValue при выборе. Я не смог создать код для лесов, чтобы посмотреть, как это должно быть сделано, потому что представление представления, которое создается с помощью представлений create, не содержит ссылок на поля в объекте forSale House.

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

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

& numBedrooms = 2

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

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

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

Ответ 1

То, что я делаю, это 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>

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

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

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