3

我最近开始了一个新的 Grails 项目,我正在尝试尽可能多地使用脚手架功能。我使用 grails install-templates 安装了模板并对其进行了修改,以便在某些方法可用时它们依赖于当前控制器(例如,如果可用,show 方法将调用 renderShow 方法)。

我遇到的问题是,当从脚手架模板调用该方法时,找不到它,因此引发了异常。如果从实际控制器调用相同的方法,它会按预期工作。

我错过了什么?

为了说明这个问题,我创建了一个小项目。有趣的提交是这个: https ://github.com/deigote/GrailsS​​caffoldingMethodCallProblem/commit/0fce966bad6e8004a7133511149c09de54be24bf

运行应用程序时,如果您转到 testDemoMethod (.../GrailsS​​caffoldingMethodCallProblem/demo/testDemoMethod) 您会呈现“嗨,我是一个方法”,并打印以下内容:

[public java.lang.Object grailsscaffoldingmethodcallproblem.DemoController.this$2$demoMethod()]

但是,如果您转到索引(.../GrailsS​​caffoldingMethodCallProblem/demo/testDemoMethod),则会打印一个空列表,并且我会收到一个异常:

Message: No signature of method: grailsscaffoldingmethodcallproblem.DemoController.demoMethod() is applicable for argument types: () values: []
   Line | Method
->>  11 | index    in grailsscaffoldingmethodcallproblem.DemoController

任何线索为什么会发生这种情况或如何解决它?

编辑:伊恩罗伯特的回答解决了这个问题:如果从脚手架模板调用,则找不到控制器方法

4

1 回答 1

2

因为this在脚手架模板中没有引用声明static scaffold = true. 当您在控制器类A中使用运行时动态脚手架时,脚手架模板用于生成一个单独的类(称为B,尽管实际上它可能与A同名但通过不同的类加载器加载)和每个实例A会将B定义但A未明确覆盖的任何操作委托给B的实例。

如果您需要从脚手架代码中获取真正的控制器实例,您可能必须使用类似的技巧

import grails.util.GrailsWebUtil
...
def index() { 
    def realController = GrailsWebUtil.getControllerFromRequest(request)
    println realController.respondsTo('demoMethod')  
    realController.demoMethod() 
    redirect(action: "list", params: params) 
}
于 2013-05-02T11:57:54.097 回答