0

getFlashHelper各コントローラーにメソッドを追加するプラグインを開発しています。FlashHelperこのメソッドは、クラスのインスタンスを返す必要があります。

ただし、クラスのコンストラクターには、メソッドが呼び出されたコントローラーのインスタンスFlashHelperを渡す必要があります。getFlashHelper

うまくいけば、次のコードが私が何をしているのかをもう少しうまく説明するでしょう

def doWithDynamicMethods = {ctx ->

    application.controllerClasses*.metaClass*.getFlashHelper = {

        def controllerInstance = delegate

        // Avoid creating a new FlashHelper each time the 'flashHelper' property is accessed
        if (!controllerInstance.metaClass.hasProperty('flashHelperInstance')) {
            controllerInstance.metaClass.flashHelperInstance = new FlashHelper(controller: controllerInstance)
        }

        // Return the FlashHelper instance. There may be a simpler way, but I tried
        // controllerInstance.metaClass.getMetaProperty('flashHelperInstance')
        // and it didn't work
        return controllerInstance.metaClass.getMetaProperty('flashHelperInstance').getter.invoke(controllerInstance, [] as Object[])
    }
}

コードは機能しているように見えますが、もっと簡単な方法があるに違いないと感じずにはいられません。その最後の行は特に恐ろしいです。これを簡単にする方法はありますか?

ありがとう、ドン

4

1 に答える 1

1

コントローラーはリクエストごとに作成されるため、ヘルパーを Request 属性として保存します。

for (c in grailsApplication.controllerClasses) {
   c.clazz.metaClass.getFlashHelper = { ->
      def controllerInstance = delegate
      def request = controllerInstance.request
      def helper = request['__flash_helper__']
      if (!helper) {
         helper = new FlashHelper(controller: controllerInstance)
         request['__flash_helper__'] = helper
      }
      helper
   }
}
于 2010-01-28T02:37:04.487 に答える