覆盖脚手架控制器中的模板方法

时间:2012-10-10 15:00:03

标签: grails controller scaffold

我有一个Grails项目,我使用大量自定义的脚手架模板向beforeUpdate添加update模板方法,以便我可以轻松自定义scaffolded Controller,而无需生成和然后分别编辑每个控制器。

不幸的是,这不起作用,只有来自脚手架的beforeUpdate被调用。 我怀疑它与Groovy使用的代码生成有关,将脚手架代码注入实际Controller,但我找不到任何确认。

我要问的是问题的解决方案或解释为什么它不起作用。

这是脚手架代码:

def beforeUpdate = {
    println "beforeUpdate from scaffold"
}

def update() {
    // call before update hook
    beforeUpdate()

    def ${propertyName} = ${className}.get(params.id)
    if (!${propertyName}) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: '${domainClass.propertyName}.label', default: '${className}'), params.id])
        redirect(action: "list")
        return
    }
    [...]

和脚手架控制器代码(未调用,但我相信它应该):

class CalendarController {
    static scaffold = Calendar

    def beforeUpdate = {
            println "beforeUpdate from controller"
    }
}

我已经尝试过 grails clean ; - )

更新

我最终意识到,由于Grails脚手架的设计方式,这简直是不可能的。闭。

2 个答案:

答案 0 :(得分:1)

你有一个与this question类似的问题 - 基本上脚手架工作的方式脚手架模板会生成一个单独的类,“真正的”控制器委托给它。因此,如果您希望生成的控制器在真实控制器上调用方法而无法使用this,则需要获取对实际控制器对象的引用。

简而言之,请使用

GrailsWebUtil.getControllerFromRequest(request).beforeUpdate()

而不仅仅是

beforeUpdate()

def update() {
    // call before update hook
    def realController = GrailsWebUtil.getControllerFromRequest(request)
    if(realController.hasProperty('beforeUpdate') &&
         realController.beforeUpdate instanceof Closure) {
      realController.beforeUpdate()
    } else {
      this.beforeUpdate()
    }

    def ${propertyName} = ${className}.get(params.id)
    if (!${propertyName}) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: '${domainClass.propertyName}.label', default: '${className}'), params.id])
        redirect(action: "list")
        return
    }
    [...]

答案 1 :(得分:0)

我最终意识到,由于Grails脚手架的设计方式,这简直是不可能的:通过动态复制/创建方法到脚手架控制器而不使用继承。