覆盖脚手架控制器中的模板方法
Posted
技术标签:
【中文标题】覆盖脚手架控制器中的模板方法【英文标题】: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 脚手架的设计方式,这根本不可能。结束。
【问题讨论】:
要“关闭”这个问题,您应该添加自己的答案,然后将其标记为已接受。 【参考方案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 脚手架的设计方式,这是不可能的:通过将方法动态复制/创建到脚手架控制器中而不使用继承。
【讨论】:
以上是关于覆盖脚手架控制器中的模板方法的主要内容,如果未能解决你的问题,请参考以下文章