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),以确保在提供无效数据时操作尽快失败。并可能将其移至服务以使用其交易功能。