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

Written by @dr_taka_n at 2009/07/10 19:37 [, ]

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 特徴としては、

  • リソース指向 (RESTFul)
  • URI がダイレクトに Ruby コードに紐付く
  • Rack ベースである

というところがある。

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

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

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

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

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

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

  • GET (取得)
  • POST (作成)
  • PUT (更新)
  • DELETE (削除)

上記 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 をベースにしていることもあって、

  • Rack に対応した Web サーバであれば動作する
  • Rack Middleware がそのまま使える

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

感想

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

参考サイト

blog comments powered by Disqus