Grails-非常简单的集合值无效

Grails-非常简单的集合值无效,grails,grails-controller,grails-domain-class,Grails,Grails Controller,Grails Domain Class,错误控制器: 这是bug的创建方法,我打印了bugInstance.activities,其中包含我的activity对象 def create = { def bugInstance = new Bug() def activity = new Activity(description:"created") bugInstance.properties = params bugInstance.addToActivities(a

错误控制器:

这是bug的创建方法,我打印了
bugInstance.activities
,其中包含我的activity对象

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

        bugInstance.properties = params
        bugInstance.addToActivities(activity)
        return [bugInstance: bugInstance]
    }
然后我查看了save方法,打印了完全相同的内容,结果为空,因此不知何故它丢失了我创建的活动,我不知道为什么。这真的是默认行为吗?我是否真的犯了一些基本的错误,因为似乎没有任何理由认为这样一段简单的代码不起作用

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

中丢失活动听起来像个愚蠢的问题,但是您是否在create.gsp中设置了隐藏参数或任何东西,并在create中实例化了Bug实例??我是说,我看不出你在这里做什么有什么不对。你的create.gsp看起来像什么

您从未对新实例调用save():

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

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

您不需要保存活动,因为它位于“活动”集合中,因此将以传递方式保存。

如果您使用的是自动生成的create.gsp,则活动集不会包含在表单中。它当然存在于模型中,但在客户端不会呈现任何活动字段。当它返回保存时,很明显该活动已丢失。根据您想要实现的目标,您可以在create.gsp中添加一些活动选择器,或者(首先)添加一个包含活动描述的隐藏字段,但在保存操作中,我想您无论如何都必须处理activities参数,因为grails的神奇之处不在于为您实例化活动。与在save操作中实例化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>

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

是的,只要我发送了持久化的bugInstance(生成ID并将其存储为其属性),那么Bug可能会在用户导航到创建页面时保存,而不是在用户实际选择保存时保存。但这确实表明,我应该在save()控制器方法中添加活动。但重点仍然是,如何以一种干净的面向对象的方式将一个传递给另一个呢?我没有,我包括了所有必要的。尽我所知编写代码。Grails没有像我预期的那样通过模型传递这个对象,它只是在表单提交时被重新创建。但还是应该有一个OO的方式来做我在这里尝试的事情
params.activities.each{ activity ->
  bugInstance.addToActivities(new Activity(activity))
}