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を利用することができます。