Ruby Freaks Lounge

第9回 SinatraとSequel・Hamlで掲示板アプリを作る

この記事を読むのに必要な時間:およそ 2.5 分

はじめに

第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
スタイルシートの定義。

動作例は以下のようになります。

図1 今回制作する,Sinatraを利用した掲示板アプリ

図1 今回制作する,Sinatraを利用した掲示板アプリ

SinatraのMVC

実際にアプリケーションを書くためには,データを保存したり,HTMLを出力したりする機能が必要です。Ruby on Rails(以下Rails)ではモデルのためのライブラリとしてActiveRecordが,ビューのためのライブラリとしてerbが(標準では)使われます。ではSinatraではどうなのでしょうか。

結論からいうと,モデル部分に関してはSinatraでのサポートは特にありません。そのため,ActiveRecordDataMapperSequelといったRuby用のO/Rマッピングライブラリを一つ選んで使うことになります。

ビュー部分に関しては,RailsでおなじみのerbHTMLをインデントで表現するHamlHTMLを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)

著者プロフィール

原悠(はらゆたか)

NaClこと「ネットワーク応用通信研究所」勤務。さまざまなプログラミング言語に興味を持つ。最近触っている言語はRuby,Scheme,JavaScript,Englishあたり。

URL:http://route477.net/

著書

コメント

コメントの記入