Skip to content

Latest commit

 

History

History
626 lines (464 loc) · 21.2 KB

README.en.rdoc

File metadata and controls

626 lines (464 loc) · 21.2 KB

Sinatra

# Sinatra is a DSL for quickly creating web-applications in Ruby with minimal # effort: Sinatraは最小限の記述で素早くWebアプリケーションを記述するためのRubyによるDSLです:

# myapp.rb
require 'rubygems'
require 'sinatra'
get '/' do
  'Hello world!'
end

# Install the gem and run with: Gemをインストールして以下のように実行します:

sudo gem install sinatra
ruby myapp.rb

# View at: localhost:4567 localhost:4567 にアクセスすることによって動作を確認できます

Routes

# In Sinatra, a route is an HTTP method paired with an URL matching pattern. RouteはHTTPメソッドと対になったURLにマッチするパターンです# Each route is associated with a block: それぞれのルートはブロックをともないます:

get '/' do
  .. 何かを表示 ..
end

post '/' do
  .. 何かを作成 ..
end

put '/' do
  .. 何かを更新 ..
end

delete '/' do
  .. 何かを削除 ..
end

# Routes are matched in the order they are defined. The first route that Routeは定義された順にマッチングが行われ、# matches the request is invoked. 最初にマッチしたものが実行されます

# Route patterns may include named parameters, accessible via the Routeパターンは名前付きパラメータを持つことができ、それらには# params hash: paramsハッシュによってアクセスできます:

get '/hello/:name' do
  # "GET /foo" や "GET /bar" にマッチする
  # params[:name] は 'foo' か 'bar' が格納されている
  "Hello #{params[:name]}!"
end

# You can also access named parameters via block parameters: また、ブロック引数としても取得することもできます:

get '/hello/:name' do |n|
  "Hello #{n}!"
end

# Route patterns may also include splat (or wildcard) parameters, accessible Routeパターンはsplat(ワイルドカード)パラメータを持つことができ、# via the params[:splat] array. 配列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

# Route matching with Regular Expressions: 正規表現によるマッチも可能です

get %r{/hello/([\w]+)} do
  "Hello, #{params[:captures].first}!"
end

# Or with a block parameter: ブロック引数によってアクセスできます:

get %r{/hello/([\w]+)} do |c|
  "Hello, #{c}!"
end

# Routes may include a variety of matching conditions, such as the user agent: Routeにはマッチングに使用するいくつかの状態を指定してすることができます. 例えばユーザエージェントを指定して:

get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
  "あなたは Songbird version #{params[:agent][0]} を利用しています"
end

get '/foo' do
  # Songbird以外のブラウザにマッチ
end

Static Files

# Static files are served from the ./public directory. You can specify 静的なファイルは./publicディレクトリから提供されます. :public # a different location by setting the :public option: オプションを指定することによって任意のディレクトリを指定することもできます:

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

# Note that the public directory name is not included in the URL. A file 注意すべき点として、パブリックディレクトリの名前はURLに含まれません. # ./public/css/style.css is made available as つまり./public/css/style.cssというファイルは# http://example.com/css/style.css. http://example.com/css/style.css として公開されます.

Views / Templates

# Templates are assumed to be located directly under the ./views テンプレートは./viewsに配置されていると仮定しているが、# directory. To use a different views directory: 以下のようにして別のディレクトリを指定することも出来る:

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

# One important thing to remember is that you always have to reference 忘れてはいけないことはテンプレートはシンボルで参照するということだ。# templates with symbols, even if they’re in a subdirectory (in this たとえサブディレクトリに配置していたとしてもである(例えばこんな具合だ# case use :'subdir/template'). Rendering methods will render :'subdir/template'). レンダーメソッドに文字列を渡したところで# any strings passed to them directly. 一切レンダリングしない.

Haml Templates

# The haml gem/library is required to render HAML templates: HAMLテンプレートをレンダリングするためにはhaml gemをrequireする必要がある:

# ## You’ll need to require haml in your app

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

get '/' do
  haml :index
end

# Renders ./views/index.haml. ./views/index.hamlをレンダリングします

# Haml’s options Haml’s options # can be set globally through Sinatra’s configurations, はSinatraのConfigurationsを用いてグローバルに設定することが可能である# see Options and Configurations, くわしくは Options and Configurations, # and overridden on an individual basis. を見てください. またレンダリング時に個別に上書きして設定することも出来ます

set :haml, {:format => :html5 } # デフォルトのHamlフォーマットは:xhtmlです

get '/' do
  haml :index, :haml_options => {:format => :html4 } # 上書き
end

Erb Templates

# ## You’ll need to require erb in your app

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

get '/' do
  erb :index
end

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

Builder Templates

# The builder gem/library is required to render builder templates: Builderテンプレートをレンダリングするにはbuilder gemをrequireする必要ああります:

# ## You’ll need to require builder in your app

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

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

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

Sass Templates

# The sass gem/library is required to render Sass templates: Sassテンプレートをレンダリングするにはsass gemをrequireする必要ああります:

# ## You’ll need to require haml or sass in your app

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

get '/stylesheet.css' do
  content_type 'text/css', :charset => 'utf-8'
  sass :stylesheet
end

# Renders ./views/stylesheet.sass. ./views/stylesheet/index.sassをレンダリングします

# Sass’ options Sass’ options # can be set globally through Sinatra’s configurations, はSinatraのConfigurationsを用いてグローバルに設定することが可能である# see Options and Configurations, くわしくは Options and Configurations, # and overridden on an individual basis. を見てください. またレンダリング時に個別に上書きして設定することも出来ます

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

# Renders the inlined template string. インライン文字列をレンダリングします

Accessing Variables in Templates

# Templates are evaluated within the same context as route handlers. Instance テンプレートはRouteハンドラと同じコンテキストで評価されます. Routeハンドラで# variables set in route handlers are direcly accessible by templates: で定義したインスタンス変数はテンプレートから直接参照ることができます:

get '/:id' do
  @foo = Foo.find(params[:id])
  haml '%h1= @foo.name'
end

# Or, specify an explicit Hash of local variables: もしくは、Hashによってローカル変数を明示的に指定することが可能です:

get '/:id' do
  foo = Foo.find(params[:id])
  haml '%h1= foo.name', :locals => { :foo => foo }
end

# This is typically used when rendering templates as partials from within この方法は、レンダリングするテンプレートが他のテンプレートの一部(partials) # other templates. である場合によく使われます

In-file Templates

# Templates may be defined at the end of the source file: テンプレートはソースファイルの末尾に定義することが出来ます:

require 'rubygems'
require 'sinatra'

get '/' do
  haml :index
end

__END__

# NOTE: In-file templates defined in the source file that requires sinatra NOTE: Sinatraをrequireしているソースファイル内に定義されたIn-fileテンプレート# are automatically loaded. Call the use_in_file_templates! は自動的に読み込まれます. もしほかのソースファイルに定義している場合は# method explicitly if you have in-file templates in other source files. 明示的にuser_in_file_templates!メソッドを呼び出す必要があります.

Named Templates

# Templates may also be defined using the top-level template method: テンプレートはまたトップレベルのtemplateメソッドによっても定義できます:

template :layout do
  "%html\n  =yield\n"
end

template :index do
  '%div.title Hello World!'
end

get '/' do
  haml :index
end

# If a template named “layout” exists, it will be used each time a template もし“layout’と言う名前のテンプレートが存在した場合、すべてのテンプレートの# is rendered. You can disable layouts by passing :layout => false. レンダリング時に同時にレンダリングされます. もしレイアウトを使いたくない場合は:layout => falseを指定することによってオフにで来ます:

get '/' do
  haml :index, :layout => !request.xhr?
end

Helpers

# Use the top-level helpers method to define helper methods for use in helpersメソッドを使うことによって、Routeハンドラや# route handlers and templates: テンプレートで利用できるhelperメソッドを定義できます:

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

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

Filters

# Before filters are evaluated before each request within the context of the Before filterは各リクエストを評価する前に、そのリクエストのコンテキストにおいて# request and can modify the request and response. Instance variables set in 実行され、任意の処理を行ったりrequestやresponseを修正することが可能です# filters are accessible by routes and templates: Before filterにおいて定義したインスタンス変数はテンプレートや、ルートからアクセスできます:

before do
  @note = 'Hi!'
  request.path_info = '/foo/bar/baz'
end

get '/foo/*' do
  @note #=> 'Hi!'
  params[:splat] #=> 'bar/baz'
end

Halting

# To immediately stop a request during a before filter or route use: 以下のようにしてBefore filterやRouteの処理中にリクエストを直ちに中止することができます:

halt

# You can also specify a body when halting … また、レスポンスのbodyを指定することもできます

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

# Or set the status and body … さらにステータスコードを指定することも出来ます

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

Passing

# A route can punt processing to the next matching route using pass: passを使うことでrouteは次のrouteへ処理をゆだねることができる

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

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

# The route block is immediately exited and control continues with the next routeは直ちに処理を中止して次にマッチしたrouteに処理を移します# matching route. If no matching route is found, a 404 is returned. もしマッチするrouteが見つからなかった場合は404が返されます

Configuration

# Run once, at startup, in any environment: 以下はSinatraを起動したときに、実行環境によらず一度だけ実行されます:

configure do
  ...
end

# Run only when the environment (RACK_ENV environment variable) is set to 以下は実行環境(環境変数RACK_ENVの値)が:productionに設定されている# :production: ときだけ実行されます:

configure :production do
  ...
end

# Run when the environment is set to either :production or 以下は:productionもしくは:testの時に実行されます# :test:

configure :production, :test do
  ...
end

Error handling

# Error handlers run within the same context as routes and before filters, which エラーハンドラはRouteやBefore filterと同じコンテキストで実行されます. これは# means you get all the goodies it has to offer, like haml, erb, 必要とされるすべての機能、たとえばhamlerbhalt # halt, etc. などを利用できるということです:

Not Found

# When a Sinatra::NotFound exception is raised, or the response’s status 例外Sinatra::NotFoundが発生するか、レスポンスのステータスコードが404だった場合は# code is 404, the not_found handler is invoked: not_foundハンドラが呼び出されます:

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

Error

# The error handler is invoked any time an exception is raised from a route error ハンドラは、RouteかBefore filterで例外が発生したときに呼び出されます. # block or before filter. The exception object can be obtained from the 例外オブジェクトはsinatra.errorRack環境変数から取得できます: # sinatra.error Rack variable:

error do
  'すみません 手に負えないエラーが発生しました - ' + env['sinatra.error'].name
end

Custom errors:

error MyCustomError do
  'おっと、いま起こったのは...' + request.env['sinatra.error'].message
end

# Then, if this happens: このとき、以下のように例外が発生すると:

get '/' do
  raise MyCustomError, 'なにかの間違い'
end

# You get this: このようなメッセージを見ることができます:

# So what happened was… something bad

おっと、いま起こったのは... 何かの間違い

# Sinatra installs special not_found and error handlers when Sinatraはdevelopment環境で実行したときだけ、特別なnot_founderror # running under the development environment. ハンドラを用意します

Mime types

# When using send_file or static files you may have mime types Sinatra send_fileを使用したとき、Sinatraは静的ファイルのMIMEタイプをあなたが# doesn’t understand. Use mime to register them by file extension: 期待するようには理解できません. 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

# The Sinatra::Test mixin and Sinatra::TestHarness class include a variety of Sinatra::TestミックスインとSinatra::TestHarnessクラスはSinatraアプリケーション# helper methods for testing your Sinatra app: のテストに利用できる豊富なヘルパーメソッドを用意しています:

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

# See www.sinatrarb.com/testing.html for more on Sinatra::Test and using it さらに www.sinatrarb.com/testing.html にSinatra::Testを使った例や、RSpecや# with other test frameworks such as RSpec, Bacon, and test/spec. Bacon, test/specのような他のテストフレームワークを利用した例があります

Command line

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

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

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

# -h # help

-h # ヘルプを表示

# -p # set the port (default is 4567)

-p # 使用するポートを指定 (デフォルト 4567)

# -e # set the environment (default is development)

-e # 実行環境を指定 (デフォルト development)

# -s # specify rack server/handler (default is thin)

-s # 使用するサーバ/ハンドラを指定 (デフォルト thin)

# -x # turn on the mutex lock (default is off)

-x # Mutexによるロックを使用する (デフォルト off)

The Bleeding Edge

# If you would like to use Sinatra’s latest bleeding code, create a local もしあなたがSinatraの最新のコードを利用したければ、以下のようにローカルに# clone and run your app with the sinatra/lib directory on the 最新のリポジトリをcloneして、sinatra/libLOAD_PATHに# LOAD_PATH: に加えた上でアプリケーションを実行してください:

cd myapp
git clone git://github.com/sinatra/sinatra.git
ruby -Isinatra/lib myapp.rb

# Alternatively, you can add the sinatra/lib<tt> directory to the また以下のようにして、あなたのアプリケーションの中で<tt>LOAD_PATH # LOAD_PATH in your application: を指定することができます:

$LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
require 'rubygems'
require 'sinatra'

get '/about' do
  "I'm running version " + Sinatra::VERSION
end

# To update the Sinatra sources in the future: Sinatraのソースを最新のものにするには以下のようにします:

cd myproject/sinatra
git pull

More