Redmine 2.4 ではチケット更新時のフックポイントがモデルからコントローラに移った
細かい変更だけど、個人的には心待ちにしていた Redmine のアップデートの話。
どんな変更?
Redmine 2.4 はスルーしていたのですが、正月の暇な空気の中で眺めてたら、チケット更新時のフックポイントの位置が変更されていました。
もともとモデルにあったフックポイントがコントローラに移動されたという割と小さな変更です。
作成時のフックポイントはもとからコントローラにあったので、この変更で統一された事になります。
何がうれしいの?
チケット更新時のフックポイントで呼び出されるプラグインを書いた場合に、プラグイン側から Rails のコントローラの機能を使えるようになりました。
たとえば、コントローラのコンテキストでは Rails のルーティングの機能が使えるため、チケットの URL が簡単に取れたりします。
どうやって使うの?
Redmine のプラグインでは、フックポイント名をメソッド名としたクラスを実装します。
フックプラグインの作り方 → Hooks - Redmine
用意されているフックポイントの一覧 → Hooks List - Redmine
例えば、チケット更新時、変更が DB に保存された直後に呼び出されるフックポイント名は controller_issues_new_after_save なので、こんな感じになります。
class FooHook < Redmine::Hook::Listener def controller_issues_new_after_save(context) end end
上記フックポイントの一覧のリンク先には明記されていませんが、フックの呼び出し元がコントローラだった場合、引数の context に呼び出し元のコントローラのインスタンスが入っています。
例えば更新したチケットの URL が欲しいならこんなに簡単に。
class FooHook < Redmine::Hook::Listener def controller_issues_new_after_save(context) issue_controller = context[:controller] issue = context[:issue] # 更新したチケットの URL を取得 url = issue_controller.issue_url(issue) end end
これがチケット作成時には簡単にできてたのですが、チケット更新時はとても面倒な処理となっていました。