Sinatraは最小限の記述で素早くWebアプリケーションを記述するためのRubyによるDSLです:
# myapp.rb require 'rubygems' require 'sinatra' get '/' do 'Hello world!' end
Gemをインストールして以下のように実行します:
sudo gem install sinatra ruby myapp.rb
localhost:4567 にアクセスすることによって動作を確認できます
RouteはHTTPメソッドと対になったURLにマッチするパターンですそれぞれのルートはブロックをともないます:
get '/' do .. 何かを表示 .. end post '/' do .. 何かを作成 .. end put '/' do .. 何かを更新 .. end delete '/' do .. 何かを削除 .. end
Routeは定義された順にマッチングが行われ、最初にマッチしたものが実行されます
Routeパターンは名前付きパラメータを持つことができ、それらにはparams
ハッシュによってアクセスできます:
get '/hello/:name' do # "GET /foo" や "GET /bar" にマッチする # params[:name] は 'foo' か 'bar' が格納されている "Hello #{params[:name]}!" end
また、ブロック引数としても取得することもできます:
get '/hello/:name' do |n| "Hello #{n}!" end
Routeパターンはsplat(ワイルドカード)パラメータを持つことができ、配列params['splat']
によってアクセスできます
get '/say/*/to/*' do # /say/hello/to/world にマッチする params[:splat] # => ["hello", "world"] end get '/download/*.*' do # /download/path/to/file.xml にマッチする params[:splat] # => ["path/to/file", "xml"] end
正規表現によるマッチも可能です
get %r{/hello/([\w]+)} do "Hello, #{params[:captures].first}!" end
ブロック引数によってアクセスできます:
get %r{/hello/([\w]+)} do |c| "Hello, #{c}!" end
Routeにはマッチングに使用するいくつかの状態を指定してすることができます. 例えばユーザエージェントを指定して:
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do "あなたは Songbird version #{params[:agent][0]} を利用しています" end get '/foo' do # Songbird以外のブラウザにマッチ end
静的なファイルは./public
ディレクトリから提供されます. :public
オプションを指定することによって任意のディレクトリを指定することもできます:
set :public, File.dirname(__FILE__) + '/static'
注意すべき点として、パブリックディレクトリの名前はURLに含まれません. つまり./public/css/style.css
というファイルはhttp://example.com/css/style.css
として公開されます.
テンプレートは./views
に配置されていると仮定しているが、以下のようにして別のディレクトリを指定することも出来る:
set :views, File.dirname(__FILE__) + '/templates'
忘れてはいけないことはテンプレートはシンボルで参照するということだ。たとえサブディレクトリに配置していたとしてもである(例えばこんな具合だ:'subdir/template'
). レンダーメソッドに文字列を渡したところで一切レンダリングしない.
HAMLテンプレートをレンダリングするためにはhaml gemをrequireする必要がある:
## あなたのアプリケーション内でrequire 'haml' しなければならない require 'haml' get '/' do haml :index end
./views/index.haml
をレンダリングします
Haml’s options はSinatraのConfigurationsを用いてグローバルに設定することが可能であるくわしくは Options and Configurations, を見てください. またレンダリング時に個別に上書きして設定することも出来ます
set :haml, {:format => :html5 } # デフォルトのHamlフォーマットは:xhtmlです get '/' do haml :index, :haml_options => {:format => :html4 } # 上書き end
## あなたのアプリケーション内でrequire 'erb' しなければならない require 'erb' get '/' do erb :index end
./views/index.erb
をレンダリングします
Builderテンプレートをレンダリングするにはbuilder gemをrequireする必要ああります:
## あなたのアプリケーション内でrequire 'buildr' しなければならない require 'builder' get '/' do content_type 'application/xml', :charset => 'utf-8' builder :index end
./views/index.builder
をレンダリングします
Sassテンプレートをレンダリングするにはsass gemをrequireする必要ああります:
## あなたのアプリケーション内でrequire 'sass' しなければならない require 'sass' get '/stylesheet.css' do content_type 'text/css', :charset => 'utf-8' sass :stylesheet end
./views/stylesheet/index.sass
をレンダリングします
Sass’ options はSinatraのConfigurationsを用いてグローバルに設定することが可能であるくわしくは Options and Configurations, を見てください. またレンダリング時に個別に上書きして設定することも出来ます
set :sass, {:style => :compact } # デフォルトのSassスタイルは :nested です get '/stylesheet.css' do content_type 'text/css', :charset => 'utf-8' sass :stylesheet, :sass_options => {:style => :expanded } # 上書き end
get '/' do haml '%div.title Hello World' end
インライン文字列をレンダリングします
テンプレートはRouteハンドラと同じコンテキストで評価されます. Routeハンドラでで定義したインスタンス変数はテンプレートから直接参照ることができます:
get '/:id' do @foo = Foo.find(params[:id]) haml '%h1= @foo.name' end
もしくは、Hashによってローカル変数を明示的に指定することが可能です:
get '/:id' do foo = Foo.find(params[:id]) haml '%h1= foo.name', :locals => { :foo => foo } end
この方法は、レンダリングするテンプレートが他のテンプレートの一部(partials) である場合によく使われます
テンプレートはソースファイルの末尾に定義することが出来ます:
require 'rubygems' require 'sinatra' get '/' do haml :index end __END__
NOTE: Sinatraをrequireしているソースファイル内に定義されたIn-fileテンプレートは自動的に読み込まれます. もしほかのソースファイルに定義している場合は明示的にuser_in_file_templates!
メソッドを呼び出す必要があります.
テンプレートはまたトップレベルのtemplate
メソッドによっても定義できます:
template :layout do "%html\n =yield\n" end template :index do '%div.title Hello World!' end get '/' do haml :index end
もし“layout’と言う名前のテンプレートが存在した場合、すべてのテンプレートのレンダリング時に同時にレンダリングされます. もしレイアウトを使いたくない場合は:layout => false
を指定することによってオフにで来ます:
get '/' do haml :index, :layout => !request.xhr? end
helpers
メソッドを使うことによって、Routeハンドラやテンプレートで利用できるhelperメソッドを定義できます:
helpers do def bar(name) "#{name}bar" end end get '/:name' do bar(params[:name]) end
Before filterは各リクエストを評価する前に、そのリクエストのコンテキストにおいて実行され、任意の処理を行ったりrequestやresponseを修正することが可能ですBefore filterにおいて定義したインスタンス変数はテンプレートや、ルートからアクセスできます:
before do @note = 'Hi!' request.path_info = '/foo/bar/baz' end get '/foo/*' do @note #=> 'Hi!' params[:splat] #=> 'bar/baz' end
以下のようにしてBefore filterやRouteの処理中にリクエストを直ちに中止することができます:
halt
また、レスポンスのbodyを指定することもできます
halt 'ここがbodyになります'
さらにステータスコードを指定することも出来ます
halt 401, 'あっちへ行け!'
pass
を使うことでrouteは次のrouteへ処理をゆだねることができる
get '/guess/:who' do pass unless params[:who] == 'Frank' "みつかった!" end get '/guess/*' do "残念でした" end
routeは直ちに処理を中止して次にマッチしたrouteに処理を移しますもしマッチするrouteが見つからなかった場合は404が返されます
以下はSinatraを起動したときに、実行環境によらず一度だけ実行されます:
configure do ... end
以下は実行環境(環境変数RACK_ENVの値)が:production
に設定されているときだけ実行されます:
configure :production do ... end
以下は:production
もしくは:test
の時に実行されます
configure :production, :test do ... end
エラーハンドラはRouteやBefore filterと同じコンテキストで実行されます. これは必要とされるすべての機能、たとえばhaml
やerb
、halt
などを利用できるということです:
例外Sinatra::NotFound
が発生するか、レスポンスのステータスコードが404だった場合はnot_found
ハンドラが呼び出されます:
not_found do 'ファイルが見つかりませんでした' end
error
ハンドラは、RouteかBefore filterで例外が発生したときに呼び出されます. 例外オブジェクトはsinatra.error
Rack環境変数から取得できます:
error do 'すみません 手に負えないエラーが発生しました - ' + env['sinatra.error'].name end
Custom errors:
error MyCustomError do 'おっと、いま起こったのは...' + request.env['sinatra.error'].message end
このとき、以下のように例外が発生すると:
get '/' do raise MyCustomError, 'なにかの間違い' end
このようなメッセージを見ることができます:
おっと、いま起こったのは... 何かの間違い
Sinatraはdevelopment環境で実行したときだけ、特別なnot_found
とerror
ハンドラを用意します
send_file
を使用したとき、Sinatraは静的ファイルのMIMEタイプをあなたが期待するようには理解できません. mime
メソッドを使ってファイルの拡張子を登録してください:
mime :foo, 'text/foo'
Sinatra rides on Rack, a minimal standard interface for Ruby web frameworks. One of Rack’s most interesting capabilities for application developers is support for “middleware” – components that sit between the server and your application monitoring and/or manipulating the HTTP request/response to provide various types of common functionality.
Sinatra makes building Rack middleware pipelines a cinch via a top-level use
method:
require 'sinatra' require 'my_custom_middleware' use Rack::Lint use MyCustomMiddleware get '/hello' do 'Hello World' end
The semantics of use
are identical to those defined for the Rack::Builder DSL (most frequently used from rackup files). For example, the use
method accepts multiple/variable args as well as blocks:
use Rack::Auth::Basic do |username, password| username == 'admin' && password == 'secret' end
Rack is distributed with a variety of standard middleware for logging, debugging, URL routing, authentication, and session handling. Sinatra uses many of of these components automatically based on configuration so you typically don’t have to use
them explicitly.
Sinatra::TestミックスインとSinatra::TestHarnessクラスはSinatraアプリケーションのテストに利用できる豊富なヘルパーメソッドを用意しています:
require 'my_sinatra_app' require 'test/unit' require 'sinatra/test' class MyAppTest < Test::Unit::TestCase include Sinatra::Test def test_my_default get '/' assert_equal 'Hello World!', @response.body end def test_with_params get '/meet', {:name => 'Frank'} assert_equal 'Hello Frank!', @response.body end def test_with_rack_env get '/', {}, :agent => 'Songbird' assert_equal "You're using Songbird!", @response.body end end
さらに www.sinatrarb.com/testing.html にSinatra::Testを使った例や、RSpecやBacon, test/specのような他のテストフレームワークを利用した例があります
Sinatraで作成したアプリケションは直接起動することができます:
ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-s HANDLER]
以下のようなコマンドラインオプションが利用できます:
-h # ヘルプを表示 -p # 使用するポートを指定 (デフォルト 4567) -e # 実行環境を指定 (デフォルト development) -s # 使用するサーバ/ハンドラを指定 (デフォルト thin) -x # Mutexによるロックを使用する (デフォルト off)
もしあなたがSinatraの最新のコードを利用したければ、以下のようにローカルに最新のリポジトリをcloneして、sinatra/lib
をLOAD_PATH
にに加えた上でアプリケーションを実行してください:
cd myapp git clone git://github.com/sinatra/sinatra.git ruby -Isinatra/lib myapp.rb
また以下のようにして、あなたのアプリケーションの中でLOAD_PATH
を指定することができます:
$LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib' require 'rubygems' require 'sinatra' get '/about' do "I'm running version " + Sinatra::VERSION end
Sinatraのソースを最新のものにするには以下のようにします:
cd myproject/sinatra git pull
-
Project Website - Additional documentation, news, and links to other resources.
-
Contributing - Find a bug? Need help? Have a patch?
-
Lighthouse - Issue tracking and release planning.
-
#sinatra on freenode.net