我有自己的Grails插件,我使用doWithDynamicMethods闭包添加动态方法:
def doWithDynamicMethods = {ctx ->
['controller'].each {
application."${it}Classes".each { theClass ->
theClass.metaClass.myMethod = { ... }
}
}
当我从控制器调用此方法时,它可以正常工作:
...
myMethod()
...
但是当我从脚手架模板中调用它时,它找不到这个方法:
...
def save() {
<%= "myMethod()" %>
}
...
有什么方法可以让它发挥作用吗?或者我是否需要使用其他模式用于支架模板的动态方法?
感谢任何提示:]
答案 0 :(得分:3)
脚手架模板不会引用您引用为scaffold true
的实际控制器。您必须抓住实际的控制器才能使用动态方法。
可以通过grails.util.GrailsWebUtil
完成,如下所示:
...
def save() {
def actualController = GrailsWebUtil.getControllerFromRequest(request)
actualController.myMethod()
}
...
当控制器(artefact)被搭建时,然后在运行时使用实际控制器的副本来搭建脚手架。所有对主控制器的调用都由副本处理。为了使用动态方法,您需要一个实际控制器的句柄,因为动态方法是由实际的控制器伪影创建的。