# 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 にアクセスすることによって動作を確認できます
# 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 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
として公開されます.
# 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. 一切レンダリングしない.
# 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
# ## 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
をレンダリングします
# 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
をレンダリングします
# 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
get '/' do haml '%div.title Hello World' end
# Renders the inlined template string. インライン文字列をレンダリングします
# 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. である場合によく使われます
# 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!
メソッドを呼び出す必要があります.
# 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
# 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
# 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
# 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, 'あっちへ行け!'
# 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が返されます
# 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 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
, 必要とされるすべての機能、たとえばhaml
やerb
、halt
# halt
, etc. などを利用できるということです:
# 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
# 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.error
Rack環境変数から取得できます: # 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_found
とerror
# running under the development environment. ハンドラを用意します
# 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'
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.
# 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のような他のテストフレームワークを利用した例があります
# 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)
# 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/lib
をLOAD_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
-
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