Ruby Freaks Lounge

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

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

Haml

今回紹介するもう一つのライブラリHamlは,HTMLをYAMLのように簡潔に記述するマークアップ言語です。日本Hamlの会というユーザグループが存在するなど,日本でも愛好者を増やし始めています。

実際の例を見てみましょう。以下のコードはHamlでHTMLのレイアウトを表現したものです。

リスト3 HamlによるHTML表現の例(views/layout.haml)

!!! XML
!!! Strict

%html
  %head
    %title SinatBBS
    %meta{:"http-equiv"=>"Content-Type", :content=>"text/html", :charset=>"utf-8"}
    %link{:rel=>"stylesheet", :type=>"text/css", :href=>"/style.css"}
  %body
    %h1 SinatBBS
    != yield

<html>や<body>といったタグの階層構造がインデントで表されます。⁠閉じタグ」が存在しない分,見た目が簡潔になっています。

もう一つ,掲示板の投稿を表示する箇所も見てみましょう。

リスト5 HamlによるHTML表現の例(views/index.haml)

- @comments.each do |comment|
  .comment
    %h2= h comment.title
    .info
      %span.name== by #{h comment.name}
      %span.date== (#{h comment.date})

    .message
      = comment.formatted_message

タグ名は「%h2」のように%を使って指定するほか,⁠%div.info」のようにclass名を同時に指定することもできます。タグ名がdivのときは省略可能なので,単に「.info」と書いても同じです。

タグ名のあとに「=」を書くとerbの「<%= %>」のように値を埋め込むことができます。⁠==」「=」と似ていますが,Rubyの「#{}」を使うことができるため,値と文字列が混在しているときに便利です。

eachメソッドで繰り返しを行う場合,erbでは「<% %>」を使いますが,Hamlでは行頭に「-」を付けます。ブロックの終わりはインデントで表現するため,⁠end」を書く必要はありません。

Sass

Hamlには,SassというCSSを生成するためのライブラリも同梱されています。Haml同様,インデントを利用するため見た目が簡潔になるほか,⁠div.comment内のh2タグ」のような階層構造を分かりやすく表現することができます。

また,変数を使って複数箇所で使われる値を定義したり,計算式を使って相対的な値の指定を行ったりと,複雑なCSSにも対応できる機能を備えています。CSS生成用のライブラリとして使っても役に立つでしょう。

今回のアプリケーションではview/style.sassにSassによるCSSの定義があります。

アプリケーション本体

今回はSequelがモデル部分を,Hamlがビュー部分を担当しているので,リクエストを受け取ってHTMLを生成するコントローラ部分がSinatraの役割になります。今回はRESTの作法に従い,GETメソッドでトップページを取得し,PUTメソッドでコメントを投稿するようにしました。

リスト6 Sinatraによるコントローラ部分(start.rb)

get '/' do
  @comments = Comments.order_by(:posted_date.desc)
  haml :index
end

put '/comment' do
  Comments.create({
    :name => request[:name],
    :title => request[:title],
    :message => request[:message],
    :posted_date => Time.now,
  })
  redirect '/'
end

PUTメソッドはサーバによってはサポートされないため,Railsと同様,⁠_method=PUT」というパラメータが指定されたときにputメソッドで登録したハンドラが呼ばれることになっています。

Sinatra,その先に

今回は「モダンなCGI」としてSinatraを利用してみましたが,Sinatra: The Bookの目次を見ると,⁠Memcachedベースのセッション」「Passenger(mod_rails)を利用したデプロイ」など,大規模サイトでの使用も視野に入れられていることが分かります。

確かに,コードの規模は小さいが大量にアクセスされるアプリケーションというものは存在します。Railsでは捌ききれない,特にアクセスの多い部分だけをSinatraで実装するというような使い分けも考えられそうです。

その他,Google App Engine上で動作したという報告もあり,今後もSinatraには要注目です。詳しい情報は公式サイトのほか,githubのリポジトリ検索を使うことで,Sinatraで書かれたアプリケーションの実例を探すことができます。

まとめ

今回はSinatraとSequel,Hamlを組み合わせてアプリケーションを作成する例を紹介しました。

次回は,また毛色の違うフレームワーク「Ramaze」をご紹介する予定です。お楽しみに!

著者プロフィール

原悠(はらゆたか)

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

URL:http://route477.net/

著書