sioaji2012のブログ

普段は組み込み開発でC言語のみです。主にプログラムや勉強日記です

Redmineプラグインもくもく 山梨 #007回 プラグイン作成試し

前回、

Rubyの記述の意味がわかりませんでした

これ。

module RedmineIine
  class Hook < Redmine::Hook::ViewListener
    def view_layouts_base_content(context = {})
      controller = context[:controller]
      if controller.controller_name == 'issues' && controller.action_name == 'show'
        controller.render partial: 'redmine_iine/hooks/view_layouts_base_content'
      end
    end
  end
end

少しだけ、勉強しようと思いますが・・・。

(本来は体系的な勉強しなければいけないですが・・・すみません。。。)

モジュール - Ruby入門

Redmineプラグイン作成でHookを使ってみる - torutkの日記

上記ページからの抜粋になりますが、調べた結果を書きます。

Rubyではクラスという概念に似たものとしてモジュールという概念があります。

・モジュールはクラスと同じくメソッドを定義する事が出来ます。
・クラス変数に相当するものはモジュールにはありませんが、
 定数は定義する事が出来ます。
・クラスはクラスからオブジェクトを作成することが出来ますが、
 モジュールでは作成することは出来ません。

フックへ登録するコールバックの定義

 まず、フックのコールバックを実装するクラスを定義します。
 このクラスは、Redmine::Hook::ViewListenerクラスを継承します。
 クラス定義を記述するファイルは、プラグインのlib下に置きます

lib/redmine_iine/hook.rb

module RedmineIine ★モジュール名
  class Hook < Redmine::Hook::ViewListener ★クラスを継承
    def view_layouts_base_content(context = {}) ★クラスと同じメソッド
      controller = context[:controller]
      if controller.controller_name == 'issues' && controller.action_name == 'show'
        controller.render partial: 'redmine_iine/hooks/view_layouts_base_content' ★部分テンプレート
      end
    end
  end
end

・モジュールの利用方法としては、
 「モジュール名.メソッド名」の形式で関数のように実行するか、
 他のクラスの中にインクルードして利用することが出来ます。

Redmineプラグイン作成の情報を調べていると、
 moduleを定義している例と定義していない例を見かけますが
 (定義していないものが多い感触)、
 書籍「Redmine Plugin Extension and Development」では
 moduleを導入しているのでそれに倣っています。
 moduleにはプラグイン名をPascalケースにした文字列を指定しています。

・クラスの中身ですが、フック名と同じ名前のメソッドを定義して、
 その中で文字列(HTML)を作成しreturnするサンプルをよく見かけますが、
 書籍ではrender_onでフック名と部分テンプレートを指定している。

部分テンプレートは、ここで指定した名前の先頭にアンダースコアを付け、
 拡張子を.erbとしたファイルに記述します
 (拡張子は、.html.erbなどでも可)。
 ファイルの場所はプラグインのapp/views/redmine_iine/hooks/の下に置きました。

app/views/redmine_iine/hooks/_view_layouts_base_content.html.erb

<%= link_to 'いいね!', '#', class: 'redmine-iine', style: 'display: none;' %>

<script>
  $('.redmine-iine').on('click', function(e) {
    e.preventDefault();
    alert('いいね!');
  });

  $(function() {
    $('.redmine-iine').prependTo('#content .contextual').show();
  });
</script>

フックへ登録(init.rb)

init.rbに次を記述します。

require_dependency 'redmine_iine/hook'

libしたのlib/redmine_iine/hook.rbが呼び込まれます。

部分テンプレートを適用する条件

controller = context[:controller]
if controller.controller_name == 'issues' && controller.action_name == 'show'
  controller.render partial: 'redmine_iine/hooks/view_layouts_base_content' ★部分テンプレート
end

実装したい画面のコントローラ名:'issues'
アクション名: 'show'
これらを探すときは、
・実際にRedmine操作して、ログから追うのが早い。
・あとは、routesを読むか。
(ハンズオンより)


今回は、以上です。
わかった様な気になっているだけですが、次に進もうと思います。
只今、体調が絶不調中。。。会社も休みがちで、もくもくもあまり進められませんでした。