gpt4 book ai didi

grails - 覆盖脚手架 Controller 中的模板方法

转载 作者:行者123 更新时间:2023-12-02 14:08:26 24 4
gpt4 key购买 nike

我有一个 Grails 项目,我在其中使用大量定制的脚手架模板来添加 beforeUpdate模板方法到 update这样我就可以轻松定制脚手架Controller ,而不必分别生成然后编辑每个 Controller 。

不幸的是,这不起作用,只有 beforeUpdate从脚手架被调用。
我怀疑这与 Groovy 用于将脚手架代码注入(inject)实际 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
}
[...]

和脚手架的 Controller 代码(没有被调用,虽然我相信它应该被调用):
class CalendarController {
static scaffold = Calendar

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

我已经尝试过 grails clean ;-)

更新

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

最佳答案

您有与 this question 类似的问题- 基本上脚手架的工作方式脚手架模板生成一个单独的类,“真实” Controller 委托(delegate)给该类。因此,如果您希望生成的 Controller 调用真实 Controller 上的方法,则不能使用 this ,您需要获取对真实 Controller 对象的引用。

长话短说,使用

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
}
[...]

关于grails - 覆盖脚手架 Controller 中的模板方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12822441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com