在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/

10-13 07:36