1

doWithDynamicMethodsクロージャーを使用して動的メソッドを追加する独自のGrailsプラグインがあります。

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

コントローラからこのメソッドを呼び出すと、正常に機能します。

...
myMethod()
...

しかし、これをスキャフォールドテンプレートから呼び出すと、このメソッドが見つかりません。

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

それを機能させる方法はありますか?または、スキャフォールドテンプレートの動的メソッドに他のパターンを使用する必要がありますか?

ヒントをありがとう:]

4

1 に答える 1

3

足場テンプレートは、参照した実際のコントローラーを参照しませんscaffold true。動的な方法を使用するには、実際のコントローラーを取得する必要があります。

grails.util.GrailsWebUtilこれは、以下に示すように実行できます。

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

コントローラ(アーティファクト)がスキャフォールディングされると、実行時に実際のコントローラのレプリカがスキャフォールディングに使用されます。メインコントローラーへのすべての呼び出しは、レプリカによって処理されます。動的メソッドは実際のコントローラーアーティファクトから作成されるため、動的メソッドを使用するには、実際のコントローラーへのハンドルが必要になります。

于 2013-08-13T01:48:26.840 に答える