スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
 

公開中の Redmine プラグイン

今、私が作って公開している Redmine のプラグインの紹介。

Redmine インフォメーション プラグイン
http://www.r-labs.org/projects/rp-admin-reports/wiki

もともと権限レポートやワークフローなど一般ユーザーでも見たいけど、管理者じゃないと見れない情報を表示するためのプラグイン。
ただ、今の売りはワークフローを図で表示すること。

もうちょっと追加したい機能はあるけど、一番つけたかった機能は完成したので、特に表示したい情報とかの要望でもない限りしばらくこのまま。



Redmine 用語集(Glossary) プラグイン
http://sourceforge.jp/projects/rp-glossary/wiki/FrontPage

Redmine を使ってみんなで用語集を作るためのプラグイン。
XP プログラミングでも言われているように、やっぱり用語集はほしいなということで作ったもの。

ある程度機能はつけたんだけど、結構バグが出てきちゃったので、今はこれを開発中。



Redmine TestLink Link プラグイン
http://sourceforge.jp/projects/rp-testlinklink/

テスト管理システムである TestLink へ Redmine からリンクを張るためのプラグイン。
TestLink から Redmine へのリンクは TestLink の機能であるけど、逆はなかったので作った。

しかし、現在はほぼ開発中止状態。
理由は TestLink 自体に個人的にあんまりはまらなかったため。ネットとかの評判は結構よかったんだけどな。
あと、後発でリンクではなく、埋め込み式でもっとよさそうなのプラグインができたので。

スポンサーサイト
 

プラグイン開発記 - init.rb から Helper メソッドの呼び出し

プラグイン開発記では、プラグイン開発中の試行錯誤やどんなことを考えてつくっていたのかなど書いていきたいと思います。
今回は Redmine 用語集プラグインの Wiki マクロでエラーとなるバグの修正。
http://www.r-labs.org/issues/813

原因は Wiki マクロを定義している init.rb でリンク作成用に作った helper のメソッドを呼び出したため。
プラグイン開発ガイドinit.rb や lib では helper のメソッドは呼び出せないと書いていたのだけど、用語集のプラグインを作っている時はうまくいっていたみたいで呼び出せていた。 Redmine のバージョンが上がってうまくいかなくなったのか、たまたまうまくいってただけなのか原因はわからないけど。

どっちにしろ、バグを修正しなければいけないので、困った時は他の人の作ったプラグインのコードを見てみる。
まず、 Wiki External Filter のプラグインを見てみた。ヘルパーのクラス名を明示的に付けているだけで普通に呼び出していたので、マネしてみたがやっぱり動かない。

そこで、ふと app 内ならいいのかなと思って model クラスにリンク作成機能を付けてみた。用語(Term)へのリンクをつくるので、 Term.link というメソッドを作った方がしっくりくるような気もする。
で、やってみると  link_to が見つからないというエラーが発生してしまった。 そこで link_to が定義されている TagHelper を model クラス(Term) に include してみた。今度は url をつくるメソッドに nil を渡しているというよくわからないエラーが出てしまった。
結局、コントローラやアクションのハッシュを渡して url のパスを作成する処理は model ではできないらしい。

また、困ったので今度は Wiki Extensions のソースコードを見てみた。そこでは、 init.rb で ActiveView :::Base のクラスに作った helper ファイル include していた。これだと思ったので、マネしてみる。
Grossary 用の helper 全部を最初に include するのもどうかと思ったので、 リンク作成する部分だけを ActiveView::Helper メソッドとして別ファイルにした。 Wiki Extensions のソースでは helper のディレクトリではなく、 lib の方においてあったので、そっちに置いて、 Redmine を再起動。
今度は立ち上がらなくなった。
よく考えたら、 ActiveView::Helpers の内のモジュールにしたので、 lib/active_view/helper/ ディレクトリに置いておかないと Redmine のパスの推測に失敗するはず。ディレクトリを深くつくるのも面倒なので、直接 require でファイルをロードしてみて、もう一度再起動。
ようやくうまくいって、修正完了。

結局、 init.rb から helper メソッドの呼び出すには、次のような手順
  1. ActiveView::Helpers 内に作ったヘルパーモジュールに呼び出したいメソッドを書く
  2. 作ったヘルパーモジュールを init.rb で、 ActiveView::Base クラスに include する

require 'term_link_helper'

ActionView::Base.class_eval do
include ActionView::Helpers::TermLinkHelper
end

 

プラグイン開発記 - content_tag の使用

Rails には content_tag というメソッドが用意されていた。

それを知らずに用語集プラグインで同じようなメソッドを定義して、使っていた。
それはちゃんと動いていたんだけど、車輪の発明していてちょっとはずかしかったので修正。

他にも用語集プラグインを作っているときはレイアウトを知らなかったので、今度レイアウト使うように直すことにする。

ちなみに content_tag は html タグを書くためのメソッドでブロックを使うかどうかで 2 つの使い方がある。(自分で作ったのは、そんなに複雑ではないので、ブロックを使う形式だけ対応していた)
content_tag(タグ名, 属性オプション, 渡された文字列をエスケープするか)
{
タグ間に入れる文字列
}

content_tag(タグ名, タグ間に入れる文字列, 属性オプション, 渡された文字列をエスケープするか)


用語集プラグインでリンク作るときに作っていた 省略名やフリガナを使う場合の例は次のような感じ。
content_tag(:abbr, "HTTP", :title=>'Hyper Text Transfer Protocol') 
# <abbr title="Hyper Text Transfer Protocol">HTTP</abbr>

content_tag(:ruby) {
tstr = content_tag(:rb, '振り仮名')
tstr += content_tag(:rp, '(')
tstr += content_tag(:rt, 'フリガナ')
tstr += content_tag(:rp, ')')
}
# <ruby><rb>振り仮名</rb><rp>(</rp><rt>フリガナ</rt><rp>)</rp></ruby>

HTTP
振り仮名(フリガナ)


Ruby on Rails 逆引きクイックリファレンス Rails 2.0対応Ruby on Rails 逆引きクイックリファレンス Rails 2.0対応
(2008/05/31)
大場 寧子、大場 光一郎 他

商品詳細を見る


Rails Way (Professional Ruby Series)Rails Way (Professional Ruby Series)
(2008/12/04)
Obie Fernandez

商品詳細を見る
 
このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
25位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
3位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

06月 | 2017年07月 | 08月
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。