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
少しだけ、勉強しようと思いますが・・・。
(本来は体系的な勉強しなければいけないですが・・・すみません。。。)
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を読むか。
(ハンズオンより)
今回は、以上です。
わかった様な気になっているだけですが、次に進もうと思います。
只今、体調が絶不調中。。。会社も休みがちで、もくもくもあまり進められませんでした。