はじめに
第9回はSinatraで作った掲示板アプリを通して,SequelとHamlという2つのライブラリを紹介しました。今回はまた別のフレームワーク「Ramaze」について紹介します。
Ramaze
Ramaze(「ラマゼ」と読みます)はシンプルで,自由度の高いWebアプリケーションフレームワークです。
シンプルなフレームワークといえば,第7回・第9回で紹介したSinatraもそうでした。SinatraはDSLを駆使して独自の世界を作っていましたが,RamazeはRubyのやり方をできるだけ踏襲します。実際のアプリケーションの例を見てみましょう。
リスト1 RamazeによるHello Worldアプリケーション
require 'rubygems'
require 'ramaze'
class MainController < Ramaze::Controller
map '/'
def hello
"Hello, world!"
end
end
Ramaze.start :port => 7000
上のプログラムを実行し, http://localhost:7000/hello にアクセスすると,画面に「Hello, world」と表示されます。
Sinatraに負けず劣らずシンプルですが,普通のRubyプログラミングのように,クラスを定義し,そのメソッドとしてアプリケーションの動作を記述します。クラス名はMainControllerとしましたが,特に規約はないので,好きな名前を付けて構いません。
「map '/'」はコントローラとURLを対応づけるための指示です。今回はMainControllerを'/'に対応づけているため,'/hello'へのアクセスでMainController#helloメソッドが実行されます。最後の「Ramaze.start」でサーバを起動しています。オプションでポート番号などを指定できます(省略すると7000番になります)。
インストール
上のプログラムを実際に実行する方法を解説します。まず,RubyGemsでRamazeをインストールします。
図1 Ramazeのインストール
gem install ramaze
現在なら,「ramaze-2009.05」というバージョンがインストールされるはずです(Ramazeはだいたい月に一回リリースがあり,年と月がバージョン番号になります)。その後,例えば「hello.rb」というファイルに上のスクリプトを保存し,以下のコマンドを実行するとアプリケーションが起動します。
図2 Hello Worldアプリケーションの起動
ruby hello.rb
選べるライブラリ
Ramazeの特徴の一つはモジュラーな設計であること,つまりいろいろな部分が「取り替え可能」になっていることです。Ramazeの提供する選択肢を見てみましょう。
サーバ
Ramazeは第7回で紹介した Rackを利用しているため,Mongrel,Thin,Passenger(mod_rails)などさまざまなアプリケーションサーバの上で動作させることができます。
ビュー部分(テンプレートエンジン)
RailsでおなじみのERBや,HTMLをインデントで表現するHamlなど,10を超えるテンプレートエンジンが標準でサポートされています。
テンプレートエンジンを切り替えるには,コントローラ内で「engine :ERB」のような指定を行います。
モデル部分(O/Rマッピングライブラリ)
Ramazeはデータベースについて感知しません。そのため,ActiveRecord,DataMapper,Sequelといったライブラリを一つ選んで使うことになります。これらのライブラリは,どれも以下のような機能を持ちます。
- Rubyのオブジェクトと,デーブル内のデータとのマッピング
- モデルクラス間の関連を扱う機能(アソシエーション)
- データベースに保存するデータの検証(バリデーション)
- データベースのスキーマを操作する機能(マイグレーション)
- プラグインによる拡張機能
ActiveRecordはRailsで標準採用されているライブラリで,同名の「Active Record」と呼ばれるデザインパターンから名付けられました。モデルクラス自身はスキーマの情報を持たず,アクセサはテーブル構造から自動的に定義されます。
ActiveRecordはRailsで利用されているため,たくさんのプラグインが作られています。
DataMapperはmerbというフレームワークでよく使われるライブラリで,同名の「Data Mapper」というデザインパターンから名付けられました。ActiveRecordと違い,テーブル構造とクラス構造は必ずしも一致する必要がなく,モデルクラスが明示的にプロパティを持ちます。
また,機能が「dm-core」「dm-validations」「dm-migrations」など複数のgemに分かれて実装されており,アプリケーションで必要な機能だけをインストールさせることが可能です。「dm-more」という,プラグインを集めたgemもあります。
Sequelは「あるテーブル」を表すオブジェクトを作り,それを通してSQLを発行するのを基本としています。対応するデザインパターンはTable Data Gatewayですが,Sequel::Modelを使うことで,ActiveRecordのようなモデルクラスを利用することもできます(第9回参照)。
SequelはAPIがシンプルなため,比較的シンプルなアプリケーションと相性が良いでしょう。一方で,利用できるプラグインはまだあまり多くないようです。

