Grails 将参数中的数据与每个键的列表值绑定
Grails Binding data from param with List values for each Key
使用 Grails 2.4.4,我有一个 .gsp 页面,returns 一个参数如下所示:
['update':'Update Budget',
'enteredAcct':['1018', '1200', '5301'],
'enteredOrg':['010', '010', '010'],
'enteredBudget':['100', '500', '200'],
'action':'updateBudget',
'format':null,
'controller':'orgs']
键的列表中值的数量从 1..x 开始变化(尽管它们的大小都相同)。有没有更简洁的方法将这些信息保存到数据库?
我的 .gsp 是:
<g:each in="${orgnList}" var="orgs">
<tr>
<td> ${orgs.acctCode}</td>
<td> <g:textField name="enteredBudget" value="${orgs.budget}"/></td>
<td> <g:hiddenField name="enteredOrg" value="${orgs.orgCode}"/> </td>
<td> <g:hiddenField name="enteredAcct" value="${orgs.acctCode}"/></td>
</tr>
</g:each>
显示给定组织的帐户和预算,并允许您仅为 "budget" 输入新值。
我的控制器如下:
(0..params.enteredAcct.size()-1).each{new Budget(
orgCode: params.enteredOrg[it],
acctCode: params.enteredAcct[it],
budget: params.enteredBudget[it],
activityDate: new Date()
).save(flush:true)}
这可行,但是如果我的参数每个键只有 1 个值,则闭包不起作用,因为 enteredAcct(或任何其他键)不再是列表,而是字符串。
我主要只是想看看是否有更有效的方法来保存返回的参数映射,该映射具有每个键的值列表,bindData 在这种情况下似乎不起作用,这可能是预期的.
我总是可以检查 params.enteredAcct instanceof List 是否使用该闭包,如果没有,则只保留单个值,但我觉得这段代码中有很多噪音。如果可能的话,我也不喜欢必须使用 flush:true,但是有了这个关闭,除非强制刷新,否则 .save() 似乎无法工作。
谢谢
对于这种情况,有方法 list in GrailsParameterMap。
params.enteredAcct // could be String or String[]
params.list('enteredAcct') // Always a List<String>
使用它的另一个好处是,对于 "is multiple" 情况,您得到的是列表而不是数组(至少在 Grails 2 中是这样。2.x 原始参数值是一个数组)。
至于刷新,您不需要它 - 但在刷新会话之前数据不会访问数据库,同时对象将保留在 Hibernate 的会话中。每个请求都会打开一个会话,因此在请求完成时它会关闭(并刷新)。每当请求读取操作(DomainClass.findBy...
、DomainClass.get...
等)时,它也会被刷新。一直刷新性能较低,所以我会避免它。
不过您可以使用 save(failOnError:true)
,以确保在提供无效数据时操作尽快失败。并可能将其移至服务以使用其交易功能。
使用 Grails 2.4.4,我有一个 .gsp 页面,returns 一个参数如下所示:
['update':'Update Budget',
'enteredAcct':['1018', '1200', '5301'],
'enteredOrg':['010', '010', '010'],
'enteredBudget':['100', '500', '200'],
'action':'updateBudget',
'format':null,
'controller':'orgs']
键的列表中值的数量从 1..x 开始变化(尽管它们的大小都相同)。有没有更简洁的方法将这些信息保存到数据库?
我的 .gsp 是:
<g:each in="${orgnList}" var="orgs">
<tr>
<td> ${orgs.acctCode}</td>
<td> <g:textField name="enteredBudget" value="${orgs.budget}"/></td>
<td> <g:hiddenField name="enteredOrg" value="${orgs.orgCode}"/> </td>
<td> <g:hiddenField name="enteredAcct" value="${orgs.acctCode}"/></td>
</tr>
</g:each>
显示给定组织的帐户和预算,并允许您仅为 "budget" 输入新值。
我的控制器如下:
(0..params.enteredAcct.size()-1).each{new Budget(
orgCode: params.enteredOrg[it],
acctCode: params.enteredAcct[it],
budget: params.enteredBudget[it],
activityDate: new Date()
).save(flush:true)}
这可行,但是如果我的参数每个键只有 1 个值,则闭包不起作用,因为 enteredAcct(或任何其他键)不再是列表,而是字符串。
我主要只是想看看是否有更有效的方法来保存返回的参数映射,该映射具有每个键的值列表,bindData 在这种情况下似乎不起作用,这可能是预期的.
我总是可以检查 params.enteredAcct instanceof List 是否使用该闭包,如果没有,则只保留单个值,但我觉得这段代码中有很多噪音。如果可能的话,我也不喜欢必须使用 flush:true,但是有了这个关闭,除非强制刷新,否则 .save() 似乎无法工作。
谢谢
对于这种情况,有方法 list in GrailsParameterMap。
params.enteredAcct // could be String or String[]
params.list('enteredAcct') // Always a List<String>
使用它的另一个好处是,对于 "is multiple" 情况,您得到的是列表而不是数组(至少在 Grails 2 中是这样。2.x 原始参数值是一个数组)。
至于刷新,您不需要它 - 但在刷新会话之前数据不会访问数据库,同时对象将保留在 Hibernate 的会话中。每个请求都会打开一个会话,因此在请求完成时它会关闭(并刷新)。每当请求读取操作(DomainClass.findBy...
、DomainClass.get...
等)时,它也会被刷新。一直刷新性能较低,所以我会避免它。
不过您可以使用 save(failOnError:true)
,以确保在提供无效数据时操作尽快失败。并可能将其移至服务以使用其交易功能。