Grails-非常简单的集合值无效
错误控制器: 这是bug的创建方法,我打印了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
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))
}