2012-11-05 36 views
1

我有我自己的Grails插件,我添加使用doWithDynamicMethods关闭动态方法:Grails的插件 - 在脚手架的控制器动态方法不起作用

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

当我打电话从控制器这种方法,工作正常:

... 
myMethod() 
... 

,但是当我把这个从脚手架模板无法找到这种方法:

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

有没有什么办法可以使它工作?或者我需要使用其他模式进行脚手架模板的动态方法吗?

感谢您的任何提示:]

回答

3

脚手架模板就不是指实际控制人,你有称为scaffold true。你必须抓住实际的控制器才能使用动态方法。

可以通过grails.util.GrailsWebUtil通过以下来进行,如下所示:

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

当控制器(人工制品)的脚手架,则实际控制的复制品在运行时脚手架使用。所有对主控制器的调用都由副本处理。为了使用动态方法,您将需要一个实际控制器的句柄,因为动态方法是由实际控制器制造的。

+0

我知道这个解决方法,但无论如何感谢。我只是好奇,如果有任何其他更好的方法,如果你通过generate-all命令生成控制器,那么你会在这里有所有这些不需要的方法。 – kuceram

+0

@ user607038那么在这种情况下,它是您的实施所需的方法。 :) – dmahapatro