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 特徴としては、
- リソース指向 (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 がそのまま使える
というコンパチビリティ、拡張性もついてくる。
感想
非常にコンパクトなフレームワークであり、設計思想も好み。拡張性も高く、今後さらに期待のできるフレームワークではないかと思える。
参考サイト
- まずは、雰囲気を掴む
- もう少し深く知る
- API を調べる
- Extensions を書きたくなったら