Grails 如何替换自己的自定义动态脚手架方法

Grails 如何替换自己的自定义动态脚手架方法,grails,grails-controller,Grails,Grails Controller,我的grails应用程序必须为每个域类的许多标准动态支架方法定义一些额外的行为 我知道我可以为每个控制器复制我需要添加的方法,事实上这就是我目前所做的。这确实意味着我的自定义代码被样板脚手架遮住了 我也尝试过导入和修改模板,但只有在我的控制器中生成静态脚手架时,它们才会参与进来。不用说,这没有多大帮助 拦截器似乎也不是我想要的,因为它们包围了动作,而不是插入到动作中。我想以某种方式拦截GORM呼叫,但这也不是我真正想要的 我真正想做的是用在我想要修改的地方有钩子的方法替换基本的动态脚手架方法 下

我的grails应用程序必须为每个域类的许多标准动态支架方法定义一些额外的行为

我知道我可以为每个控制器复制我需要添加的方法,事实上这就是我目前所做的。这确实意味着我的自定义代码被样板脚手架遮住了

我也尝试过导入和修改模板,但只有在我的控制器中生成静态脚手架时,它们才会参与进来。不用说,这没有多大帮助

拦截器似乎也不是我想要的,因为它们包围了动作,而不是插入到动作中。我想以某种方式拦截GORM呼叫,但这也不是我真正想要的

我真正想做的是用在我想要修改的地方有钩子的方法替换基本的动态脚手架方法

下面是我试图实现的一个示例

    // standard "save" dynamic scaffold method decorated with hooks for custom code
    def save() {
        def ${propertyName} = new ${className}(params)

        saveBeforeSave(${propertyName})

        if (!${propertyName}.save(flush: true)) {
            render(view: "create", model: [${propertyName}: ${propertyName}])
            return
        }

        saveAfterSave(${propertyName})

        flash.message = message(code: 'default.created.message', args: [message(code: '${domainClass.propertyName}.label', default: '${className}'), ${propertyName}.id])
        redirect(action: "show", id: ${propertyName}.id)
    }

    // Placeholders hooks to be overridden in controller as necessary
    def saveBeforeSave(${propertyName}) {
    }
    def saveAfterSave(${propertyName}) {
    }

您不能简单地使用以下命令:

grails install-templates
然后修改控制器? 和

只需将控制器配置为

static scaffold = *MODEL*
并将修改应用于
/src/templates/scaffolding/Controller.groovy


不需要生成来使用生成控制器

我刚刚完成了一篇关于编写自定义脚手架行为的文章。内部工作是从grails源代码脚手架插件复制的。你可以看看实际情况,然后

正如我上面提到的,从我所能告诉你的,这个修改了静态支架,也就是说,我可以添加我的修改,然后生成控制器,但是它写了所有的东西。我不想看到成百上千行的样板文件只是为了添加几行自定义代码,特别是考虑到我无法在混乱中找到自定义代码,这似乎已经做到了。奇怪的是,我以前试过,但那时候不起作用。我有“staticscaffold=true”而不是“staticscaffold=domainclass”,也许这会有所不同?@MichaelRutherfurd你能分享完整的代码吗?我也试着这么做,但没有成功。谢谢。你的文章到底说了什么?如果发生链接损坏怎么办?