はじめに
第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がシンプルなため、比較的シンプルなアプリケーションと相性が良いでしょう。一方で、利用できるプラグイン はまだあまり多くないようです。
ロガー
標準出力やファイルにログを記録する他、syslogに出力したり、Growlで通知させたりと、さまざまなロギング方法をサポートしています。またそれらのうち複数の手段を同時に使うこともできます。
Ramazeでログに文字列を出力するには、例えば以下のように記述します。
リスト2 ログ出力の例
Ramaze::Log.info "created new entry"
処理系
RamazeはさまざまなRuby処理系に対応しています。具体的には、Ruby 1.8系、1.9系、JRuby 、Rubinius での動作が確認されています。
プロジェクトの始め方
先ほどのHello Worldアプリケーションのように1ファイルから開発を始めることができる一方、Railsのようにアプリケーションのひな形を生成して、それを基盤に開発を行うやり方もサポートされています。
例えばプロジェクト名がhelloならば、以下のコマンドを実行することでhelloというディレクトリが作成され、その中のstart.rbを実行することでサーバが起動します。
リスト3 アプリケーションのひな形の作成
ramaze create hello
その他の特徴
Ramazeのその他の特徴を紹介します。
豊富なヘルパー
Ramazeにはヘルパーと呼ばれる、コントローラに便利なメソッドを追加する機能が備わっています。OpenID等による認証を行うものや、簡単なローカライズを行うものなど、さまざまなヘルパーが用意されています 。またlib/ramaze/contrib 以下にもアプリケーションの作成を助けるコードが含まれています。
ヘルパーを読み込むには、コントローラ内で「helper :httpdigest」などといった指定を行います。
綺麗なソースコード
Ramazeのソースコードは、基本的に1クラスが1ファイルに、1つのモジュールによる名前空間が1ディレクトリに対応しているため、クラス名からそれが定義されているファイルを容易に探すことができます。
またRamazeはバージョン2009.04から、「 ramaze」と「innate」という2つのライブラリに分割されました。Innate はRamazeの機能のうち、Webフレームワークとして最低限必要な機能のみを抜き出したライブラリで、現在はRamazeのコアとして使用されています。
豊富なサンプルコード
この他、標準添付のサンプルコード が充実していることもRamazeの特徴です。基本機能のサンプルがbasic/に、テンプレートエンジンの使用例がtemplates/に、ヘルパーの使用例がhelpers/に、実際のアプリケーション例がapp/に、その他のサンプルコードがmisc/にまとめられています。
まとめ
今回はシンプルで自由度の高いフレームワークRamazeのいろいろな機能について紹介しました。
次回は、Ramazeを使って実際にアプリケーションを作ってみる予定です。お楽しみに!