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() - >中丢失活动。保存()
答案 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))
}
但在您的情况下,从单个字段中实例化一个活动可能就足够了。