Grails插件 - 脚手架中控制器的动态方法不起作用

时间:2012-11-05 16:30:39

标签: grails grails-plugin metaclass

我有自己的Grails插件,我使用doWithDynamicMethods闭包添加动态方法:

def doWithDynamicMethods = {ctx ->
    ['controller'].each {
         application."${it}Classes".each { theClass ->
         theClass.metaClass.myMethod = { ... }
    }
}

当我从控制器调用此方法时,它可以正常工作:

...
myMethod()
...

但是当我从脚手架模板中调用它时,它找不到这个方法:

...
def save() {
    <%= "myMethod()" %>
}
...

有什么方法可以让它发挥作用吗?或者我是否需要使用其他模式用于支架模板的动态方法?

感谢任何提示:]

1 个答案:

答案 0 :(得分:3)

脚手架模板不会引用您引用为scaffold true的实际控制器。您必须抓住实际的控制器才能使用动态方法。

可以通过grails.util.GrailsWebUtil完成,如下所示:

...
def save() {
    def actualController = GrailsWebUtil.getControllerFromRequest(request)
    actualController.myMethod() 
}
...

当控制器(artefact)被搭建时,然后在运行时使用实际控制器的副本来搭建脚手架。所有对主控制器的调用都由副本处理。为了使用动态方法,您需要一个实际控制器的句柄,因为动态方法是由实际的控制器伪影创建的。