Redmine 2.4 ではチケット更新時のフックポイントがモデルからコントローラに移った

細かい変更だけど、個人的には心待ちにしていた Redmine のアップデートの話。

どんな変更?

Redmine 2.4 はスルーしていたのですが、正月の暇な空気の中で眺めてたら、チケット更新時のフックポイントの位置が変更されていました。

Defect #15044: Patch for giving controller_issues_edit_after_save api hook the correct context - Redmine

もともとモデルにあったフックポイントがコントローラに移動されたという割と小さな変更です。

作成時のフックポイントはもとからコントローラにあったので、この変更で統一された事になります。

何がうれしいの?

チケット更新時のフックポイントで呼び出されるプラグインを書いた場合に、プラグイン側から 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

これがチケット作成時には簡単にできてたのですが、チケット更新時はとても面倒な処理となっていました。

まとめ

とても細かい Redmine 2.4 の機能について説明しました。

この変更によってチケットの更新時のフックプラグインの実装に自由度が出てくると思います。