Rails pluginの作り方

Rails 0.14からpluginの仕組みが導入され、今までは「libにライブラリを置いて、config/enviroment.rbに〜を記述して云々」という面倒な方法が、vender/plugins以下にファイルを配置するだけで、Rails本体の拡張が簡単に可能になりました。その作り方をRailsでRESTを簡単に実現するpluginを題材に説明します。
まずは配置するファイルですが、

 vender/plugins/プラグイン名/init.rb # 必須
 vender/plugins/プラグイン名/lib/* # pluginで利用するライブラリ ディレクトリは$LOAD_PATHに追加される。必須ではない

となります。順序としてはconfig/enviroment.rbが読み込まれた後に、init.rbがevalで実行されます。
ではvender/plugins/restmode/init.rbに

require_dependency 'rest_filter'

ActionController::Base.class_eval do
  private
  def self.restmode
    around_filter RestFilter.new
  end
end

を、vender/plugins/restmode/lib/rest_filter.rbに

class RestFilter
  def before(controller)
    controller.action_name = controller.request.method.to_s
  end
  def after(controller); end
end

と記述したファイルを設置します。これだけでplugin作成は完了です。他にやることは何もないんです!あとは配布するなり、アプリケーションに含めるなりお好きにどうぞ。

さて、このplugin作成で説明したrestmode pluginですが、どのように使うかというと、controllerに一行 restmode と書くとそれだけでそのcontrollerでRESTを簡単に使うことができるようになります。具体的にはメソッドにget, post, delete, putなど各種メソッドを定義するだけで、HTTPのGET,POST,DELETE,PUTが叩かれた時に、対応するcontrollerのメソッドが呼ばれます。

class RestController < ApplicationController
  restmode

  def get
    # ...
  end
  def post
    # ...
  end
  def delete
    # ...
  end
  def put
    # ...
  end
end

action名を参照したいんだけど、という場合にもparams[:action]にaction名が入っているので困りません。これでRailsで簡単にRESTアーキテクチャアプリケーションが作れそうですね。plugin自体は合計12行ほどですが、このようなRails本体に手を加えることも非常に簡単にできるのが、Rubyという言語の柔軟さとフレームワークの仕組みが大変良くできているからでしょう。

自動でpluginをインストールするスクリプト

svn headなRailsでは RAILS_ROOT/script/plugin というスクリプトが用意されており、このスクリプトを利用することで

 $ ./script/plugin install plugin_name

と簡単にpluginをインストールすることが可能です。これは http://wiki.rubyonrails.org/rails/pages/Plugins のページからプラグイン一覧を取得し、それを解析して比較的力業で行っています。svn headなrailsを使っていない人は、
http://lesscode.org/2005/10/27/rails-simplest-plugin-manager/
で記述されている方法で./script/pluginを利用することができます。