【问题标题】:Override a template method in scaffolded controllers覆盖脚手架控制器中的模板方法
【发布时间】:2012-10-01 02:34:17
【问题描述】:

我有一个 Grails 项目,在该项目中我使用大量定制的脚手架模板将 beforeUpdate 模板方法添加到 update,这样我就可以轻松地自定义脚手架 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 脚手架的设计方式,这根本不可能。结束。

【问题讨论】:

  • 要“关闭”这个问题,您应该添加自己的答案,然后将其标记为已接受。

标签: grails controller scaffold


【解决方案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
    }
    [...]

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-04-09
      • 2017-01-04
      • 2020-05-16
      • 1970-01-01
      • 2013-04-26
      • 2016-05-22
      • 2011-12-05
      • 2020-02-20
      • 2015-02-14
      相关资源
      最近更新 更多