Grails - 非常简单的集合集合值不起作用

时间:2010-07-19 21:16:34

标签: grails grails-controller grails-domain-class

Bug的控制器:

这是一个bug的创建方法,我打印出bugInstance.activities并且其中有我的活动对象

def create = {
        def bugInstance = new Bug()
        def activity = new Activity(description:"created")

        bugInstance.properties = params
        bugInstance.addToActivities(activity)
        return [bugInstance: bugInstance]
    }

然后我查看了save方法,并打印了完全相同的东西,结果为null,所以不知怎的,它丢失了我创建的活动,我不知道为什么。这真的是默认行为吗?我做了一些非常基本的错误,因为似乎没有任何理由这么简单的代码不起作用。

def save = {

    def bugInstance = new Bug(params)
    println bugInstance.activities
    if (bugInstance.save(flush: true)) {
        flash.message = "${message(code: 'default.created.message', args: [message(code: 'bug.label', default: 'Bug'), bugInstance.id])}"
        redirect(action: "show", id: bugInstance.id)
    }
    else {
        render(view: "create", model: [bugInstance: bugInstance])
    }
}

我知道我可以通过在save方法中添加活动来解决这个问题,但为什么我会从create() - >中丢失活动。保存()

3 个答案:

答案 0 :(得分:1)

你永远不会在新实例上调用save():

def create = {
   def bugInstance = new Bug()
   def activity = new Activity(description:"created")

   bugInstance.properties = params
   bugInstance.addToActivities(activity)
   bugInstance.save()
   return [bugInstance: bugInstance]
}

您不需要保存活动,因为它会被传递保存,因为它在活动集合中。

答案 1 :(得分:0)

可能听起来像一个愚蠢的问题,但你是否在create.gsp中设置一个隐藏的参数或任何东西,并在创建中实例化了Bug实例?我的意思是,我认为你在这里所做的事并没有错。你的create.gsp是什么样的?

答案 2 :(得分:0)

如果您使用自动生成的create.gsp,则活动集将不会包含在表单中。它当然在模型中,但在客户端没有活动字段。当它返回保存时,很明显活动丢失了。根据你想要实现的目标,你可以在create.gsp中添加一些活动选择器,或者(以一开始)在你的活动描述中添加一个隐藏字段,但是在保存操作中我猜你必须处理任何活动参数。例如,因为grails的魔力并没有为你实现活动。与在保存操作中实例化Bug本身的方式相同,如果要保留活动,则必须实例化活动,甚至保存活动。

编辑:如果您真的想传递整个活动列表,可以使用索引属性。

在create.gsp中添加:

<g:each status="i" var="activity" in="${bugInstance.activities}">
  <!-- one hidden field for each property of each attached activity  -->
  <g:hiddenField
    name="activities[${i}].description"
    value="${activity.description}" />
</g:each>

在保存方法中:

params.activities.each{ activity ->
  bugInstance.addToActivities(new Activity(activity))
}

但在您的情况下,从单个字段中实例化一个活动可能就足够了。

相关问题