如何在 Grails GSP 中保存复合字段值?
Posted
技术标签:
【中文标题】如何在 Grails GSP 中保存复合字段值?【英文标题】:How do I save a composite field value in Grails GSP? 【发布时间】:2011-01-08 14:15:50 【问题描述】:我有一个复合域对象如下:
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 生成的创建视图不包含对 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>
在您的参数字符串中,您需要*forSale*.numBedrooms=2
。此代码适用于person.properties = params
或new Person(params)
。
嵌入的“指令”只告诉 Hibernate 将参数包含在同一个表中,它们仍然是单独的域类。即使您可能永远不会使用它,它也可能会为域生成一个表。
希望这会有所帮助。
【讨论】:
如果您检查我的代码,您会发现我正在使用 forSale.numBedrooms 并且我更改了 url 参数以引用它。当我检查 URL 参数上的内容时,我将我的 forSale 字段组合到一个对象中。更重要的是,我按照您的建议使用 params 分配给属性。问题是我的表格行没有得到更新。堆栈中的某些东西,无论是 grails 还是 hibernate,都在默默地失败。我已经为所有内容和一个 128Mb 的日志文件打开了调试日志记录,并且没有消息说更新失败。我不知道发生了什么。 你的代码有 你需要像 这样的代码以上是关于如何在 Grails GSP 中保存复合字段值?的主要内容,如果未能解决你的问题,请参考以下文章
Grails:如何消除 create.gsp 和 save.gsp 并将其移动到 list.gsp 中列表的第一行?
通过 Grails 中 gsp 的参数发送 LocalTime 对象
Grails 在 javascript 内的 GSP 站点中使用 grails var