Ruby Freaks Lounge

第11回自由なWebフレームワーク、Ramaze

はじめに

第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はデータベースについて感知しません。そのため、ActiveRecordDataMapperSequelといったライブラリを一つ選んで使うことになります。これらのライブラリは、どれも以下のような機能を持ちます。

  • 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系、JRubyRubiniusでの動作が確認されています。

プロジェクトの始め方

先ほどの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を使って実際にアプリケーションを作ってみる予定です。お楽しみに!

おすすめ記事

記事・ニュース一覧