在grails中保存域类的新实例后,我有一个"创建另一个这样的"弹出另一个创建屏幕的按钮,其中的字段填充了我刚创建的实例的值。
在第一次尝试中,我将所有现有字段值作为params传递给备用创建按钮:
<g:link class="create" action="create"
params="[app:volInstance.app.id,
ass:volInstance.assessment.id,
name:volInstance.volName,
type:volInstance.volType.id,
note:volInstance.volNote,
recommendation:volInstance.recommendation,
discovered:volInstance.dateFound,
url:volInstance.urlParam]">
Create Another like this
</g:link>
然后在下一个create.gsp上执行大量<g:if>
以查看参数是否存在。然后我进而发送实例id作为param
<g:link class="create" action="create"
params="[vid:volInstance.id]">
并更改了控制器中的create方法。这个简化的事情(不再有一个巨大的参数列表):
def create() {
if (params.vid) {
def id = params.vid
def v = Vol.findById(id)
params.volNote = v?.volNote
params.volType = v?.volType
etc......
}
respond new Vol(params)
}
这很好用并消除了所有<g:if>
但仍然有很多行params.x = v.x
有没有办法摆脱这些线,只是将对象作为一个参数传递?
答案 0 :(得分:2)
看起来像Command Object
的好地方。您可以在控制器中声明它,然后将其作为参数传递给您的操作。如果需要,您甚至可以添加验证。
class MyCommand {
Long id
String volNote
String volType
static constraints = {
volNote (blank: false)
//...
}
}
然后在你的行动中:
def create(MyCommand cmd) {
Long id = cmd.id
//...