0

错误控制器:

这是一个错误的创建方法,我打印出来了bugInstance.activities,里面有我的活动对象

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

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

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

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() 中丢失活动

4

3 回答 3

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]
}

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

于 2010-07-19T22:46:57.280 回答
0

听起来可能是个愚蠢的问题,但是您是否在 create.gsp 中设置了隐藏参数或任何内容,并且在 create 中实例化了 Bug 实例?我的意思是,我看不出你在这里所做的有什么问题。你的 create.gsp 是什么样的?

于 2010-07-19T21:31:10.933 回答
0

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

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

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

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

于 2010-07-19T22:48:38.173 回答