Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Tlansrate the Sinatra README.rdoc to Japanese. (SinatraのREADME.rdocを日本語に訳していきます)

branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 README.en.rdoc
Octocat-spinner-32 README.rdoc
Octocat-spinner-32 Rakefile
README.rdoc

Sinatra

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 にアクセスすることによって動作を確認できます

Routes

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

Static Files

静的なファイルは./publicディレクトリから提供されます. :public オプションを指定することによって任意のディレクトリを指定することもできます:

set :public, File.dirname(__FILE__) + '/static'

注意すべき点として、パブリックディレクトリの名前はURLに含まれません. つまり./public/css/style.cssというファイルは example.com/css/style.css として公開されます.

Views / Templates

テンプレートは./viewsに配置されていると仮定しているが、 以下のようにして別のディレクトリを指定することも出来る:

set :views, File.dirname(__FILE__) + '/templates'

忘れてはいけないことはテンプレートはシンボルで参照するということだ。 たとえサブディレクトリに配置していたとしてもである(例えばこんな具合だ :'subdir/template'). レンダーメソッドに文字列を渡したところで 一切レンダリングしない.

Haml Templates

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

Erb Templates

## あなたのアプリケーション内でrequire 'erb' しなければならない
require 'erb'

get '/' do
  erb :index
end

./views/index.erbをレンダリングします

Builder Templates

Builderテンプレートをレンダリングするにはbuilder gemをrequireする必要ああります:

## あなたのアプリケーション内でrequire 'buildr' しなければならない
require 'builder'

get '/' do
  content_type 'application/xml', :charset => 'utf-8'
  builder :index
end

./views/index.builderをレンダリングします

Sass Templates

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

Inline Templates

get '/' do
  haml '%div.title Hello World'
end

インライン文字列をレンダリングします

Accessing Variables in Templates

テンプレートは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) である場合によく使われます

In-file Templates

テンプレートはソースファイルの末尾に定義することが出来ます:

require 'rubygems'
require 'sinatra'

get '/' do
  haml :index
end

__END__

@@ layout
%html
  = yield

@@ index
%div.title Hello world!!!!!

NOTE: Sinatraをrequireしているソースファイル内に定義されたIn-fileテンプレート は自動的に読み込まれます. もしほかのソースファイルに定義している場合は 明示的にuser_in_file_templates!メソッドを呼び出す必要があります.

Named 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

helpersメソッドを使うことによって、Routeハンドラや テンプレートで利用できるhelperメソッドを定義できます:

helpers do
  def bar(name)
    "#{name}bar"
  end
end

get '/:name' do
  bar(params[:name])
end

Filters

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

Halting

以下のようにしてBefore filterやRouteの処理中にリクエストを直ちに 中止することができます:

halt

また、レスポンスのbodyを指定することもできます

halt 'ここがbodyになります'

さらにステータスコードを指定することも出来ます

halt 401, 'あっちへ行け!'

Passing

passを使うことでrouteは次のrouteへ処理をゆだねることができる

get '/guess/:who' do
  pass unless params[:who] == 'Frank'
  "みつかった!"
end

get '/guess/*' do
  "残念でした"
end

routeは直ちに処理を中止して次にマッチしたrouteに処理を移します もしマッチするrouteが見つからなかった場合は404が返されます

Configuration

以下はSinatraを起動したときに、実行環境によらず一度だけ実行されます:

configure do
  ...
end

以下は実行環境(環境変数RACK_ENVの値)が:productionに設定されている ときだけ実行されます:

configure :production do
  ...
end

以下は:productionもしくは:testの時に実行されます

configure :production, :test do
  ...
end

Error handling

エラーハンドラはRouteやBefore filterと同じコンテキストで実行されます. これは 必要とされるすべての機能、たとえばhamlerbhalt などを利用できるということです:

Not Found

例外Sinatra::NotFoundが発生するか、レスポンスのステータスコードが404だった場合は not_foundハンドラが呼び出されます:

not_found do
  'ファイルが見つかりませんでした'
end

Error

error ハンドラは、RouteかBefore filterで例外が発生したときに呼び出されます. 例外オブジェクトはsinatra.errorRack環境変数から取得できます:

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_founderror ハンドラを用意します

Mime types

send_fileを使用したとき、Sinatraは静的ファイルのMIMEタイプをあなたが 期待するようには理解できません. mimeメソッドを使ってファイルの拡張子を登録してください:

mime :foo, 'text/foo'

Rack Middleware

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.

Testing

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のような他のテストフレームワークを利用した例があります

Command line

Sinatraで作成したアプリケションは直接起動することができます:

ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-s HANDLER]

以下のようなコマンドラインオプションが利用できます:

-h # ヘルプを表示
-p # 使用するポートを指定 (デフォルト 4567)
-e # 実行環境を指定 (デフォルト development)
-s # 使用するサーバ/ハンドラを指定 (デフォルト thin)
-x # Mutexによるロックを使用する (デフォルト off)

The Bleeding Edge

もしあなたがSinatraの最新のコードを利用したければ、以下のようにローカルに 最新のリポジトリをcloneして、sinatra/libLOAD_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

More

Something went wrong with that request. Please try again.