Redmineのプラグイン作ってみた

よくわからない先入観で面倒くさいイメージがあったんだけど
http://d.hatena.ne.jp/mallowlabs/20081121/1227298411
http://www.redmine.org/wiki/redmine/Plugins
を見て作ってみたら思いのほか簡単(15分くらい)に出来てしまった。

作ったもの

チケットを優先度に応じてタグクラウド風に表示するアプリ。バグクラウド命名
cssこちらを参考にさせて頂いて少し手を入れた。

動作イメージ


ソースコード

init.rb
require 'redmine'

Redmine::Plugin.register :redmine_bugcloud do
  name 'Redmine Bugcloud plugin'
  author 'maedana'
  description 'This is a plugin for Redmine. The view that displays the ticket like the tag cloud is added. '
  version '0.0.1'

  permission :bugcloud, { :bugcloud => [:index] }, :public => true
  menu :project_menu, :bugcloud, { :controller => 'bugcloud', :action => 'index' }, :caption => :bugcloud, :last => true
end
app/controller/bugcloud

@projectは当初使わないからいいやと思って、ローカル変数にしてたんだけど、@にしないとメニューなどが一切表示されなくなってしまうので必須。
あと、unloadableって書かないとdevelopmentで動かした時にリロードするとエラーになる。でもなんでなのかわからなくて気持ち悪い。

class BugcloudController < ApplicationController
  unloadable

  def index
    @project = Project.find params[:id]
    @issues = @project.issues
  end
end
app/views/bugcloud/index.html.erb

スタイルシートを使いたい場合は以下のように書くと使える。

<% content_for :header_tags do %>
  <%= stylesheet_link_tag 'bugcloud', :plugin => 'redmine_bugcloud' %>
<% end %>

<h2><%= l(:bugcloud) %></h2>
<ul class="bugcloud">
<% @issues.each do |issue| -%>
  <li class="level<%= h issue.priority.position %>">
    <%= link_to h(issue.subject), :controller => 'issues', :action => 'show', :id => issue %>
  </li>
<% end -%>
</ul>

全体のソースは以下においた。
http://github.com/maedana/redmine_bugcloud/tree/master

気になったこと

developmentモードで動かすと、自作pluginのviewに対してアクセスすると初回は問題ないが、2度目にアクセスすると
A copy of ApplicationController has been removed from the module tree but is still active!
などというメッセージとともにArgumentErrorが発生する。production環境だと発生しない。今のところ原因がよくわからない。

(追記)
http://d.hatena.ne.jp/tomisima/20090126/1232994598
に書いてあるようにcontrollerでunloadableを呼ぶとエラーは起きなくなる。つか公式サイトのプラグイン作成チュートリアルにも書いてあった。ちゃんと読もう > 自分

まとめ

redmineプラグインは怖くなかった