如何在单个“提交”中更新grails中同一域对象的多个实例?

时间:2014-01-22 13:21:52

标签: grails

我有一个数据表,有些东西如下

Id     Name       LastName
1      John       Doe
2      Jane       Roi
3      Jerry      amol
4      Jeff       Jels


'SAVE' 'CANCEL'

以上所有行都是可编辑的,我可以编辑所有4行(id,name,lastname)并点击“SAVE”按钮。这里的挑战是我已经将所有4行值传递给控制器​​并验证每个字段,如果有任何错误必须将错误发送回每行查看,如果罚款则在数据库中更新。怎么做到这一点?请帮帮我

以下是我的观点:

<table id='show_brands_table'>
<tbody>
    <g:each in="${brandsList}" status="i" var="brands">         
        <tr id="tr_brand_${brands.id}" class="${(i % 2) == 0 ? 'even' : 'odd'}">
            <td>
                <input type="text" id="brand_${brands.id}"  value="${brands.brand}" class="${(i % 2) == 0 ? 'even' : 'odd'}"></input>
            </td>
            <td>
                <input type="text" id="brandID_${brands.id}" value="${brands.bpBrandId}" class="${(i % 2) == 0 ? 'even' : 'odd'}"></input>
            </td>
            <td>
            <g:select id="weight${id}" name="weight${id}"from="${}"value="${weight}" onchange="modify();" />                                            
            </td>
        </tr>           
    </g:each>
</tbody>

1 个答案:

答案 0 :(得分:1)

Grails可以将表单结果绑定到多个对象。对表单元素名称使用前缀后跟一个点来区分各个对象。例如:

<g:each in="${brandsList}" status="i" var="brand">       
  <input type="text" name="brand_${brand.id}.name" value="${brand.name}">
  <input type="text" name="brand_${brand.id}.weight" value="${brand.weight}">
  ...
</g:each>

在你的控制器中,你必须遍历params并找出已经提交了多少个对象。您可以将前缀作为参数查找,然后将其用作名称空间:

def update() {
    for (name in params.keySet()) {
        def match = name =~ /^brand_(\d+)$/
        if (match) {
            def id = m[0][1] as long
            def brand = Brand.get(id)
            brand.properties['name', 'weight'] = params[name]
            brand.save()
        }
    }
}

有关详细信息,请参阅手册中的Grails Data Binding部分。