retrospectiva拡張のススメ!

2008/06/06 16:58:33

rails製プロジェクト管理ツールのretrospectiva。いわゆるtracのrailsクローン。rails製BTSならredmineとかもあるけれど、デザインと名前でretrospectivaを使ってます。

retrospectiva

実は先日のセミナーで、retrospectivaの拡張について書くと言っていたんですが、改めて調べてみたら、公式で拡張の使い方が説明されてるの見つけて(しかも大分前からあったみたい)、取り立てて書くこともなくなっちゃったなぁと。。。

さすがにそれじゃあんまりなので、サンプルでチケットに期限を入れられる拡張を作ってみます。

対象のバージョンは、r502のtrunkでやっていきます。いつの間にかrails2.0対応になってるしね。Rubyの環境がなければhttp://retrospectiva.org/wiki/Quick%20installに沿ってインストールしてください

Rubyの環境が整っていれば、

svn co http://retrospectiva.googlecode.com/svn/trunk retrospectiva
mv config/database.yml.todo config/database.yml
vi config/database.yml(とりあえずdevelopmentだけ設定)
mysql -uroot -e "create database retrospectiva default charset=utf8"
rake RAILS_ENV=production db:retro:load
rake RAILS_ENV=production db:migrate
./script/server

で、http://localhost:3000にアクセスすると、retrospectivaが見れます。

とりあえず、右上のAdminメニューから適当にプロジェクトを作って、チケットも一つつくってください。簡単のため、チケットを作ってから、後で期日を入れられるようにします。拡張名はticket_dueとします。

まずはextensionsの下に、ticket_dueというディレクトリを作ります。今回のコーディング作業は全てこの中だけで行うことにします。

■拡張用migration

まずは、この拡張用にticketsテーブルに期日カラムを追加したいんだけど、ここでdb/migrateなんかに新しく作るわけにもいかない。でもちゃんと拡張用のmigrationの仕組みも用意されてる。

ticket_dueの下に、db/migration.rbというファイルを作る

module Retrospectiva
  module Extension
    module TicketDue
      class Migration < ::ActiveRecord::Migration
        def self.up
          add_column :tickets, :due_at, :datetime
        end

        def self.down
          remove_column :tickets, :due_at
        end
      end
    end
  end
end

あとで作ったextensionのインストールをするんだけれど、その時に勝手にこいつが実行される。カッコいい

■表示の拡張

次に表示させる箇所を設定します。
tiket_dueの直下にext_info.rbというファイルを作って、次の内容を記述

RetroEM::Views.register_extension('ticket_due/due', :ticket, :info, :bottom)

これをやると、app/viewsの方にあるテンプレートファイルの中で、
<%= view_extensions(:ticket, :info, :bottom) %>
って書いてある部分に、指定したファイルの内容が挿入されます。

本体を全くいじりたくないので、今回はもともとview_extensionsが書いてあるところだけが拡張できる部分になります。

で、今回はtiket_due/dueというテンプレートを指定してるので、そのファイルをextension/ticket_due/views/ticket_due/_due.html.erbとして作る

とりあえず内容はこんな感じかな

<code>  &lt;tr&gt;
    &lt;th class="horz"&gt;期日:&lt;/th&gt;
    &lt;td&gt;
      &lt;span id="ticket-due"&gt;&lt;%= @ticket.due_at.to_s %&gt;&lt;/span&gt;
      &lt;%= ipeh_for_ticket_due_at(@ticket) %&gt;
    &lt;/td&gt;

    &lt;th class="horz"&gt;&lt;/th&gt;&lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;</code>

ipeh_for_ticket_due_at(@ticket)ってのは、この次に作るヘルパー。編集用フォームを表示してくれるヘルパーです。

■ヘルパーの追加

TicketsHelperにipeh_for_ticket_due_atを追加する時は、ticket_due/ext/tickets_helper.rbを作る

module Retrospectiva
  module Extension
    module TicketDue
      module TicketsHelperExtension

        def ipeh_for_ticket_due_at(ticket)
          tag_id = "ticket-due"
          options = {:no_wrap =&gt; true}
          options[:url] = {:controller =&gt; 'tickets', :action =&gt; 'modify_due', :id =&gt; ticket.id}
          inplace_editor_handle('期日設定', tag_id, options)
        end

      end
    end
  end
end

TicketsHelper.send(:include, Retrospectiva::Extension::TicketDue::TicketsHelperExtension)

■アクションの追加

ヘルパーで変更用アクションを、tickets_controllerのmodify_dueアクションと指定したので、次はtickets_controllerの拡張だね。基本はhelperと同じ

module Retrospectiva
  module Extension
    module TicketDue
      module TicketsControllerExtension

        def modify_due
          @ticket = Project.current.tickets.find(params[:id])
          @ticket.due_at = params[:value]
          @ticket.save

          render :text =&gt; @ticket.due_at.to_s(:db)
        end

      end
    end
  end
end

TicketsController.send(:include, Retrospectiva::Extension::TicketDue::TicketsControllerExtension)

■インストール

$ ruby script/rxm install ticket_due RAILS_ENV=production

これで、マイグレーションも実行されて、期日設定もできるようになってるはず

本体は全くいじってないのに、こんな簡単に拡張できちゃう。retrospectivaってよくできてるよね

押忍

※このエントリは builder メンバーにより投稿されたものです。シーネットネットワークスジャパン および builder編集部の見解・意向を示すものではありません。
記事の感想やご意見をコメントでお寄せください

ニックネーム : CNET_IDにログインしてコメントする

コメント本文(必須) :
  • 昨日のトップ記事
  • 2日前
  • 3日前
  • 8日前
  • 9日前
  • 新着記事
  • 人気記事
  • 特集
  • ブログ