Skip to content

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

Notifications You must be signed in to change notification settings

Sixeight/sinatra-japanese-readme

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 

Repository files navigation

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というファイルはhttp://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__

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

About

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

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published