多个创建/编辑grails

时间:2010-11-17 06:53:40

标签: grails

是否可以一次添加/更新多个实例?例如,我们有一个带有bname,tile的域类书。在gsp中,我们显示了一个具有多个bname和title fileds的表单。谁能告诉我如何编写crteate / edit动作?

3 个答案:

答案 0 :(得分:0)

有可能。您需要创建bulkCreate / bulkUpdate页面,并附加适当的控制器和服务方法。没有什么可以阻止您在服务中执行以下操作:

def book1 = new Book(bname1, btitle1)
def book2 = new Book(bname2, btitle2)
book1.save()
book2.save()

您可能希望在那里进行验证。 bname1等是您在表单中定义的参数。

答案 1 :(得分:0)

在循环中使用上述代码,并且能够成功添加/更新记录

for(i in 0..booksSize){ def book1 =新书(bname1,btitle1) 如果(!book1.save()){ flash.message =“错误消息” } }

如果有任何行有错误/无效数据如何显示用户输入的数据以及cont / gsp中的错误?从上面我只得到最后一行错误。

答案 2 :(得分:0)

我知道这已经有几年了,但我想我会为这个常见问题添加一个更新的答案。

Grails提供了一些方便的工具,允许使用Command Objects,ListUtils和FactoryUtils进行多记录更新。

以下是可用于保存多个时间卡移位条目的示例:

class ShiftEntryListCommand {
    List<ShiftEntryCommand> entries = ListUtils.lazyList(
            new ArrayList(), FactoryUtils.instantiateFactory(ShiftEntryCommand)
    )
}

class ShiftEntryCommand {
    BigDecimal totalHours
    Date date
    String projectName

    static constraints = {
        totalHours (blank: false, min: 0.00, max: 24.00, matches: /^someRegex$/)
        date (blank: false, matches: /^someRegex$/)
        projectName (nullable: true, blank: true, matches: /^someRegex$/)
    }
}

您实际上创建了两个命令对象。一个用于表单数据的单个实例,另一个用于单个实例的列表。 list命令对象使用ListUtils和FactoryUtils来处理&#34; bulk&#34;表单输入和每个单个实例仍然使用约束进行验证。

您需要从apache commons集合中导入ListUtils和FactoryUtils:

import org.apache.commons.collections.FactoryUtils
import org.apache.commons.collections.ListUtils

它会在这样的动作中使用:

def save(ShiftEntryListCommand cmd) {
    //other action code follows ...
}

现在,所有发送到save方法的批量表单数据都由命令对象处理和验证。要保存记录,您可以遍历列表并在每个列表上调用save()或使用Hybernate方法进行批量插入。在我们的例子中,我们选择循环遍历每条记录。不知道为什么。

希望有人觉得这很有用。