【问题标题】:Grails Plugin - Dynamic Method for Controller in Scaffolded doesn't workGrails 插件 - 脚手架中控制器的动态方法不起作用
【发布时间】:2012-10-25 12:50:10
【问题描述】:

我有自己的 Grails 插件,我在其中使用 doWithDynamicMethods 闭包添加了一个动态方法:

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

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

...
myMethod()
...

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

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

有什么方法可以让它工作吗?或者我是否需要使用其他模式作为脚手架模板的动态方法?

感谢任何提示:]

【问题讨论】:

    标签: grails grails-plugin metaclass


    【解决方案1】:

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

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

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

    当一个控制器(人工制品)被搭建时,实际控制器的副本会在运行时用于搭建。对主控制器的所有调用都由副本处理。为了使用动态方法,您需要一个实际控制器的句柄,因为动态方法是根据实际控制器工件创建的。

    【讨论】:

    • 我知道这种解决方法,但无论如何感谢。我只是好奇是否还有其他更好的方法,因为如果您通过 generate-all 命令生成控制器,那么您将在那里拥有所有这些不需要的方法。
    • @user607038 在这种情况下,它是您实现所需的方法。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 2014-03-02
    相关资源
    最近更新 更多