我有一个复合域对象,如下所示:
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>
请注意,我正在选择的fieldValue中使用forSale.numBedrooms。我无法生成脚手架的代码来查看应该如何完成,因为由create-views生成的create View 不包含对forSale House对象中字段的引用。
我也无法提供通过GSP访问的复合字段的任何示例,因此这有点猜测。在任何情况下,GSP页面的呈现均无错误,尽管这可能是因为我无法保存任何数据。
我将numBedrooms的值作为URl查询字符串的一部分发回...
&numBedrooms = 2
当我这样做时, Controller 中的保存代码会静默失败-至少没有任何内容写入数据库。我已经打开了调试日志记录的几乎所有内容,但日志中没有任何消息表明任何错误,尽管显然是错误的。
如果我从查询字符串中删除numBedrooms参数,那么保存将照常进行,因此我猜测这与解析numBedrooms有关。
有什么提示我做错了什么以及我可以做些什么来找出问题所在?
最佳答案
我要做的是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在同一表中包括参数,它们仍然是单独的Domain类。即使您可能永远不会使用它,它也可能会为该域生成一个表。
希望这可以帮助。
关于grails - 如何在Grails GSP中保存复合字段值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2123871/