在grails中保存一个域类的新实例后,我有一个“创建另一个类似这样”的按钮,它会弹出另一个创建屏幕,在该屏幕中,用刚创建的实例的值填充字段。
在第一次尝试中,我在一个替代的create按钮中将所有现有的字段值作为参数传递:
<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作为参数发送<g:link class="create" action="create"
params="[vid:volInstance.id]">
并更改了 Controller 中的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>
,但仍然有很多参数行。x = v.x是否有办法摆脱这些限制,而只是将对象作为参数传递?
最佳答案
看起来是 Command Object
的好地方。您可以在 Controller 中声明它,然后将其作为参数传递给您的操作。您甚至可以根据需要添加验证。
class MyCommand {
Long id
String volNote
String volType
static constraints = {
volNote (blank: false)
//...
}
}
然后在您的操作中:
def create(MyCommand cmd) {
Long id = cmd.id
//...
关于grails - 在grails中实现 “create another like this”功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24143962/