在grails中实现“create this like”功能

时间:2014-06-10 14:45:37

标签: grails

在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 有没有办法摆脱这些线,只是将对象作为一个参数传递?

1 个答案:

答案 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
    //...