はじめに
第7回はRails以外のWebフレームワークの簡単な紹介と,SinatraでHello Worldアプリケーションを動かすところまでを解説しました。今回はSinatraで実際のアプリケーションを作り,SequelとHamlという2つのライブラリを紹介します。
Sinatraの特徴は,CGIスクリプトのようにファイル一つからアプリケーションが書ける気軽さです。CGIスクリプトといえば,代表的なものは何と言っても掲示板(BBS)です。そこで,今回はSinatraで掲示板アプリを作ってみました。ソースコードが少し長めなので,githubにて全文を公開しています。適宜参照しながら読み進めて下さい。ファイル構成は以下のようになっています。
- start.rb
- アプリケーションの本体。
- model/comment.rb
- 掲示板の書き込みを表すモデルの定義。
- view/index.haml
- トップページのHTMLの定義。
- view/layout.haml
- HTMLのレイアウト定義。
- view/style.sass
- スタイルシートの定義。
動作例は以下のようになります。
SinatraのMVC
実際にアプリケーションを書くためには,データを保存したり,HTMLを出力したりする機能が必要です。Ruby on Rails(以下Rails)ではモデルのためのライブラリとしてActiveRecordが,ビューのためのライブラリとしてerbが(標準では)使われます。ではSinatraではどうなのでしょうか。
結論からいうと,モデル部分に関してはSinatraでのサポートは特にありません。そのため,ActiveRecord,DataMapper,SequelといったRuby用のO/Rマッピングライブラリを一つ選んで使うことになります。
ビュー部分に関しては,Railsでおなじみのerb,HTMLをインデントで表現するHaml,HTMLをRubyのメソッドで表現するBuilderが標準でサポートされています。
今回は紹介も兼ねて,モデル部分にSequelを,ビュー部分にHamlを使ってみることにします。
Sequel
SequelはRubyのコードでSQLを書くことを目指したライブラリで,データベースのきめ細かい操作を得意とします。APIは比較的シンプルで,ActiveRecordのような「モデルオブジェクト」の定義さえも必須ではありません(この場合の検索結果はハッシュで受け取ります)。
一方,利便性のために,Sequel::Modelによるモデル定義や,has_manyなどのアソシエーション,スキーマのマイグレーションなどの機能も提供されています。今回の掲示板アプリケーションから,Sequelでモデルオブジェクトを定義している部分を見てみましょう。
リスト1 Sequelによるモデル定義の例(model/comment.rb)
Sequel.connect("sqlite://comments.db")
class Comments < Sequel::Model
unless table_exists?
set_schema do
primary_key :id
string :name
string :title
text :message
timestamp :posted_date
end
create_table
end
# (略)
end
最初の行でSQLiteのデータベースに接続しています。以降で定義しているCommentsクラスはこのデータベース内のテーブルに関連づけられます。アプリケーションを最初に起動したときはテーブルが存在しないため,set_schemaでスキーマを定義し,create_tableでテーブルを作成しています。
実際にデータを取得する部分は以下のようになります。「ORDER BY」や「DESC」のようなSQLのキーワードを,そのままRubyの世界に写したような書き方がSequelの特徴です。
リスト2 Sequelによるクエリの例(start.rb)
@comments = Comments.order_by(:posted_date.desc)

