7

grailsアプリケーションで使用しているプラ​​グイン(Nimble 0.3)には、いくつかのコントローラーと関連するアクションが含まれています。いくつかのアクションの動作を(少し)変更したいのですが、どうすればそれを実現できるのでしょうか。

プラグインコントローラーから継承し、アクション実装の一部をオーバーライドする子コントローラーを作成できますか?

または、プラグインコントローラーと同じ名前で別のパッケージにある別のコントローラーを作成できますか?

実際、私が本当に理解する必要があるのは、名前の競合がある場合にGrailsが呼び出すコントローラーアクションをどのように決定するかということです。

4

3 に答える 3

8

PluginControllerという名前のプラグインコントローラーと、オーバーライドするアクション'foo'があるとすると、コントローラーをサブクラス化できます。

class MyController extends PluginController {

   def foo = {
      ...
   }
}

ただし、UrlMappingsでいくつかの作業を行う必要があります。

class UrlMappings {

   static mappings = {
      "/$controller/$action?/$id?" {
         constraints {}
      }

      "/myController/foo/$id?"(controller: "myController", action: "foo")
      "/myController/$action?/$id?"(controller: "pluginController")
      "/pluginController/$action?/$id?"(controller: "errors", action: "urlMapping")

      "/"(view:"/index")
      "500"(view:'/error')
      "404"(controller: "errors", action: "notFound")
   }
}

これはErrorsControllerに依存します:

class ErrorsController {

   def notFound = {
      log.debug "could not find $request.forwardURI"
   }

   def urlMapping = {
      log.warn "unexpected call to URL-Mapped $request.forwardURI"
      render view: 'notFound'
   }
}

古い「マップされていない」コントローラーアクションを呼び出すと、404ページがレンダリングされます。適切な404ページを表示するには、grails-app / views / errors/notFound.gspを作成する必要があります。

最初のURLマッピングにより、オーバーライドされたアクションが確実に呼び出されます。2つ目は、他のすべてを元のコントローラーにルーティングします。そして3番目は直接アクセスのために404を送信します。

于 2010-02-06T22:46:17.143 に答える
2

Grails 1.3.7 と Nimble プラグイン 0.4 では、Burt の UrlMapping ソリューションがうまくいかないことがわかりました。ただし、Burtの他の回答によると、プラグインコントローラーをサブクラス化し、同じ名前を持つコントローラーを作成するだけで機能しました

class AuthController extends grails.plugins.nimble.core.AuthController{

    private static String TARGET = 'grails.plugins.nimble.controller.AuthController.TARGET'

    def login = {
        // custom logic here    
    }
}
于 2011-03-21T23:31:11.860 に答える
0

元のクラスをサブクラス化し、必要な動作をオーバーライドします。私は別のプラグインでその多くを行っていますが、うまく機能します。

もちろん、プラグインをインラインで使用して元のソースを変更するという別の方法もありますが、アップグレードで問題が発生するため、それはさらに悪いことです。

私は Nimble のユーザーでもあります。あなたの拡張機能が他のユーザーに使用される可能性があると思われる場合は、貢献してください。

于 2010-02-03T18:55:55.643 に答える