Ruby Freaks Lounge

第34回 Redmineプラグイン開発(1)

この記事を読むのに必要な時間:およそ 6 分

ステータス変更機能の実装

では今度はステータスの変更機能を実装していきます。アクション名はtoggleとし,ステータスのリンクをクリックしたら稼働中/停止のキャプションがAJAXで変わるようにします。

まずはコントローラのコードです。

app/controllers/servers_controller.rb(追加部分のみ)

def toggle
  if request.xhr? && request.post?
    server = Server.find(params[:id])
    server.update_attributes!(:status => server.status ^ 3)

    user = User.current # ①
    comment = Comment.new(:comments => "#{user.login}さんが#{server.status_name}に変更しました。", :author => user)
    server.comments << comment

    render :update do |page|
      page.replace_html "status_#{server.id}", server.status_name
      page.visual_effect :shake, "status_#{server.id}" 
    end
  end
end

①のUser.currentメソッドでログインユーザのインスタンスを取得しています。その他は特にRedmineとは関連しないため,解説は割愛します。

次にビューのコードです。AJAXに対応するため,ステータスの表示部分を書き換えています。

app/views/servers/index.html.erb(変更部分のみ)

<%- @servers.each do |server| -%>
<tr class="<%= cycle("odd", "even") %> server">
<td><%=h server.name %></td>
<td><%= link_to_remote content_tag(:span, h(server.status_name), :id => "status_#{server.id}"), :url => { :action => "toggle", :id => server.id }, :method => "post" %></td>
</tr>
<%- end -%>

履歴の確認機能の実装

最後に履歴の確認画面を作ります。アクション名はshowとします。これも特にRedmineとは関連しないため,解説は割愛します。

app/controllers/servers_controller.rb(変更部分のみ)


def show
  @server = Server.find(params[:id], :include => [:comments])
end

app/views/servers/index.html.erb(変更部分のみ)

<%- @servers.each do |server| -%>
<tr class="<%= cycle("odd", "even") %> server">
<td><%= link_to h(server.name), :action => 'show', :id => server.id %></td>
<td><%= link_to_remote content_tag(:span, h(server.status_name), :id => "status_#{server.id}"), :url => { :action => "toggle", :id => server.id }, :method => "post" %></td>
</tr>
<%- end -%>

app/views/servers/show.html.erb

<h2><%=h @server.name %>のステータス変更履歴</h2>

<%- @server.comments.each do |comment| -%>
  <p><%=h comment.created_on.strftime("%F %T") %> : <%=h comment.comments %></p>
<%- end -%>

これで一通りの実装が完了しました。こんな感じの画面になります。

図4 サーバ一覧画面

図4 サーバ一覧画面

図5 ステータス変更履歴画面

図5 ステータス変更履歴画面

まとめ

今回は基本的なプラグインの開発方法を解説しました。ここまで見ていただいたように,Redmineのプラグイン開発は非常に自由度が高く,チケットやWikiなどのビルトインされている機能とまったく関連のないものでも作ることができます。また,通常のRailsアプリを作るような感覚で実装できるため,Railsに慣れている方であればほとんど学習コストはかからないでしょう。今回作成したServerStatusプラグインにサーバの追加や削除機能を追加するのも簡単です。

RedmineやTracなどのプロジェクト管理ツールはプロジェクトのポータルページを兼ねることが多いと思います。そこに手軽に自作のシステムを組み込むことができる,と言うのは非常に魅力的ではないでしょうか。

次回はワークフローとデプロイタスクを統合するContinuousDeploymentというプラグインを作成します。チケットやタイムラインとの連動についても解説していきますので,どうぞお楽しみに。

著者プロフィール

京和崇行(きょうわたかゆき)

株式会社カカクコム所属。食べログをRailsでリニューアルした時のメンバーの一人。 今は主にサーバサイドの開発とチューニングを担当…のはずだが他にも色々やっている。 クライミングとニコニコ動画とtwitterがあれば生きていける。