Skip to content

Sinatra - 軽量だが拡張性の高い Ruby の Web App フレームワーク

Posted on:2009年7月10日 at 19:37

Table of Contents

Open Table of Contents

Sinatra とは

Rack を調べていた際、Ruby で書かれた軽量フレームワーク Sinatra も Rack をベースに書かれていると知る。そこで、Sinatra をちょっと確認してみた。

Sinatra は、Web アプリケーションを作る際の軽さのインパクトで大きく話題をさらった。ちなみに、“Hello World!!” Web アプリケーションは以下の記述だけで済む。

hello_world.rb:

require 'rubygems'
require 'sinatra'
get '/' do
  "Hello World!"
end

以下で起動。

$ ruby hello_world.rb
== Sinatra/0.10.1 has taken the stage on 4567 for development with backup from Thin
>> Thin web server (v1.2.2 codename I Find Your Lack of Sauce Disturbing)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:4567, CTRL+C to stop

http://localhost:4567/ にアクセスすると、“Hello World!” が表示される。

事前に RubyGems で sinatra をインストールしておく必要がある。

$ gem sudo install sinatra

最新版の edge を使いたい場合には、

上記 GitHub でソースは管理されているので、

$ git clone git://github.com/sinatra/sinatra.git

clone しておいて、Ruby のライブラリロードパスに lib 配下を追加する。

例えば先程の “Hello World!” アプリケーションの例であれば、頭の 1 行に以下のような記載を追加しておく。File_dirname(__FILE__) は、hello_world.rb ファイルの存在するパスを返すので、git clone した Sinatra の lib のパスに合うようにしておく。

hello_world.rb:

$LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
require 'rubygems'
require 'sinatra'
get '/' do
  "Hello World!"
end

Sinatra の特徴

「Rails を使うにはちょっと too much と思えるアプリケーションの場合には、さくっと Sinatra で書く」、というような利用のされ方がよく言われているが、個人的には、Sinatra の潜在能力はもっと高いように思える。

Sinatra 特徴としては、

というところがある。

Sinatra は、Rails のように何から何まで揃っている統合フレームワーク環境ではない。 Sinatra 自体は非常にコンパクトになっており、各自必要となるようなものは、RubyGems なりで拡張する。

例えば、Rails でいう ActiveRecord のような Model 部分をフレームワークとして持っている訳ではない。ActiveRecord なり、Sequel なり、好きなもの選択して使うことになる。

リソース指向(RESTFul)/URI がダイレクトに Ruby コードに紐付く

リソース指向というと、大袈裟な表現かもしれない。リソース指向アーキテクチャでいうところのその全ての要素をフレームワークがまかなっている訳ではなく、そのアーキテクチャにそった実装がやり易いのではないかと思う。

Sinatra は Web アプリケーションを作成するための DSL (Domain Specific Language) を提供しており、 先程の “Hello World!” アプリケーションでは、get メソッドの引数に対象リソースのパスを定義し、そのパスが指定された時の表現方法(処理)をコードブロックに記載していた。

メソッド名がそのまま対応する HTTP メソッドになっており、以下の 4 つのメソッドに対応する。

上記 HTTP メソッド名の小文字表記が Sinatra DSL でのそれぞれのメソッドに対応する。 対象となるリソースに対する操作として、get/post/put/delete メソッドを選択して使用することになる。

なお、現状、ブラウザは、GET と POST のメソッドしかサポートしておらず、PUT と DELETE のメソッドにはごまかしを入れる必要がある。

Rails でもそうしているように、Form の送信時(method=POST)に、hidden パラメータとして、_method キーを追加し、その値にメソッド名を含める必要がる。

例えば、リソースの削除(DELETE)を行いたい時には、

<form method='post' action='/delete_it'>
  ....
  <input name='_method' value='delete' />
  <button type='submit'>Delete</buton>
</form>

上記の記載を行うことで、Sinatra のアプリケーション側では、

delete 'delete_it' do
  ...delete process....
end

という記載で処理を行える。

更新の時も同様に、_method キーに put を指定し、put 'update_it' do ....更新時の処理.... end とやる必要がある。(更新の場合、post でそのままやっているアプリケーションを多く見るが。。)

Rack ベースである

Rack をベースにしていることもあって、

というコンパチビリティ、拡張性もついてくる。

感想

非常にコンパクトなフレームワークであり、設計思想も好み。拡張性も高く、今後さらに期待のできるフレームワークではないかと思える。

参考サイト