Grails将param中的数据与每个Key的List值绑定

时间:2015-08-06 18:39:03

标签: grails grails-controller

使用Grails 2.4.4,我有一个.gsp页面,它返回一个如下所示的参数:

        ['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>

显示给定组织的帐户和预算,并允许您仅为“预算”输入新值。

我的控制器如下:

           (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)}

哪个有效,但是如果我的params每个键只有1个值,则闭包不起作用,因为enteredAcct(或任何其他键)不再是列表,而是String。

我主要只是想看看是否有更有效的方法来保存返回的params Map,其中包含每个键的值列表,在这种情况下bindData似乎不起作用,这可能是预期的。 / p>

我总是可以检查params.enteredAcct instanceof List是否使用该闭包,如果没有,只需保留单个值,但我觉得这段代码中有很多噪音。我也不喜欢使用flush:如果可能的话,是真的,但是使用该闭包,除非强制刷新,否则.save()似乎不起作用。

由于

1 个答案:

答案 0 :(得分:0)

对于这种情况,list中的方法GrailsParameterMap

params.enteredAcct // could be String or String[]
params.list('enteredAcct') // Always a List<String>

使用它的另一个好处是,因为&#34;是多个&#34;例如,你得到的是列表而不是数组(至少在Grails 2.2.x中,原始参数值是一个数组)。

至于同花顺,你不需要它 - 但数据不会打到数据库直到会话被刷新,同时对象将保留在Hibernate的会话中。每个请求都会打开一个会话,因此在请求完成时它会关闭(并刷新)。每当请求读取操作(DomainClass.findBy...DomainClass.get...等)时,它也会被刷新。一直冲洗的性能较差,所以我会避免它。

您可以使用save(failOnError:true),以确保在提供无效数据时尽快失败。并且可能将其移至服务以使用其交易功能。