如何在Grails GSP中保存复合字段值?

时间:2010-01-23 16:52:16

标签: grails composite gsp

我有一个复合域对象,如下所示:

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>

请注意,我在select的fieldValue中使用forSale.numBedrooms。我无法为此创建脚手架代码来查看它应该如何完成,因为create-views生成的create视图不包含对forSale House对象中的字段的引用。

我也无法找到通过GSP访问的复合字段的任何示例,所以这是一个猜测。在任何情况下,GSP页面都会呈现没有错误,但这可能是因为我无法保存任何数据。

我将numBedrooms的值作为URl查询字符串的一部分发回...

&安培; numBedrooms = 2

当我这样做时,我的控制器中的保存代码无声地失败 - 至少没有任何东西被写入数据库。我已经为几乎所有内容打开了调试日志记录,但是我在日志中没有收到任何错误的消息,尽管有些事情显而易见。

如果我从查询字符串中删除numBedrooms参数,那么我的保存会正常进行,所以我猜这与解析numBedrooms有关。

任何线索我做错了什么以及我能做些什么来追查我的问题?

1 个答案:

答案 0 :(得分:0)

我对generate-allHouse所做的是复制并粘贴GSP代码并在完成后删除文件。我还发现,在我稍后使用House域的情况下,创建模板以编辑House域名更为明智。

对于GSP,你需要这样的东西(注意名字属性)

<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 = paramsnew Person(params)

嵌入式“指令”只告诉Hibernate将参数包含在同一个表中,它们仍然是单独的Domain类。它可能会为域生成一个表,即使您可能永远不会使用它。

希望这有帮助。