1
0
Fork 0
mirror of https://github.com/sinatra/sinatra synced 2023-03-27 23:18:01 -04:00

Apply syntax highlight to README.jp.md

This commit is contained in:
Ryunosuke SATO 2014-01-13 22:03:03 +09:00
parent 326b60169b
commit 66a583b86a

View file

@ -5,11 +5,13 @@
[DSL](http://ja.wikipedia.org/wiki/ドメイン固有言語)です。
``` ruby
# myapp.rb
require 'sinatra'
get '/' do
'Hello world!'
end
```
gemをインストールして動かしてみる。
@ -136,6 +138,7 @@ end
ルートにはユーザエージェントのようなさまざまな条件を含めることができます。
``` ruby
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
"You're using Songbird version #{params[:agent][0]}"
end
@ -143,9 +146,11 @@ end
get '/foo' do
# Matches non-songbird browsers
end
```
ほかに`host_name``provides`条件が利用可能です:
``` ruby
get '/', :host_name => /^admin\./ do
"Admin Area, Access denied!"
end
@ -157,9 +162,11 @@ end
get '/', :provides => ['rss', 'atom', 'xml'] do
builder :feed
end
```
独自の条件を定義することも簡単にできます:
``` ruby
set(:probability) { |value| condition { rand <= value } }
get '/win_a_car', :probability => 0.1 do
@ -169,6 +176,7 @@ end
get '/win_a_car' do
"Sorry, you lost."
end
```
### 戻り値
@ -191,6 +199,7 @@ Rackレスポンス、Rackボディオブジェクト、HTTPステータスコ
そのように、例えばストリーミングの例を簡単に実装することができます:
``` ruby
class Stream
def each
100.times { |i| yield "#{i}\n" }
@ -198,13 +207,16 @@ Rackレスポンス、Rackボディオブジェクト、HTTPステータスコ
end
get('/') { Stream.new }
```
## 静的ファイル
静的ファイルは`./public`ディレクトリから配信されます。
`:public_folder`オプションを指定することで別の場所を指定することができます。
``` ruby
set :public_folder, File.dirname(__FILE__) + '/static'
```
注意: この静的ファイル用のディレクトリ名はURL中に含まれません。
例えば、`./public/css/style.css``http://example.com/css/style.css`でアクセスできます。
@ -214,7 +226,9 @@ Rackレスポンス、Rackボディオブジェクト、HTTPステータスコ
テンプレートは`./views`ディレクトリ下に配置されています。
他のディレクトリを使用する場合の例:
``` ruby
set :views, File.dirname(__FILE__) + '/templates'
```
テンプレートはシンボルを使用して参照させることを覚えておいて下さい。
サブデレクトリでもこの場合は`:'subdir/template'`のようにします。
@ -224,12 +238,14 @@ Rackレスポンス、Rackボディオブジェクト、HTTPステータスコ
hamlを使うにはhamlライブラリが必要です:
``` ruby
# hamlを読み込みます
require 'haml'
get '/' do
haml :index
end
```
`./views/index.haml`を表示します。
@ -239,20 +255,24 @@ options](http://haml.info/docs/yardoc/file.HAML_REFERENCE.html#options)
Configurations](http://www.sinatrarb.com/configuration.html),
を参照してそれぞれ設定を上書きして下さい。
``` ruby
set :haml, {:format => :html5 } # デフォルトのフォーマットは:xhtml
get '/' do
haml :index, :haml_options => {:format => :html4 } # 上書き
end
```
### Erb テンプレート
``` ruby
# erbを読み込みます
require 'erb'
get '/' do
erb :index
end
```
`./views/index.erb`を表示します。
@ -260,12 +280,14 @@ Configurations](http://www.sinatrarb.com/configuration.html),
erubisテンプレートを表示するには、erubisライブラリが必要です:
``` ruby
# erubisを読み込みます
require 'erubis'
get '/' do
erubis :index
end
```
`./views/index.erubis`を表示します。
@ -286,12 +308,14 @@ builderを使うにはbuilderライブラリが必要です:
鋸を使うには鋸ライブラリが必要です:
```
# 鋸を読み込みます
require 'nokogiri'
get '/' do
nokogiri :index
end
```
`./views/index.nokogiri`を表示します。
@ -299,12 +323,14 @@ builderを使うにはbuilderライブラリが必要です:
Sassテンプレートを使うにはsassライブラリが必要です:
``` ruby
# hamlかsassを読み込みます
require 'sass'
get '/stylesheet.css' do
sass :stylesheet
end
```
`./views/stylesheet.sass`を表示します。
@ -314,22 +340,26 @@ options](http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options)
Configurations](http://www.sinatrarb.com/configuration.html),
を参照してそれぞれ設定を上書きして下さい。
``` ruby
set :sass, {:style => :compact } # デフォルトのSass styleは :nested
get '/stylesheet.css' do
sass :stylesheet, :sass_options => {:style => :expanded } # 上書き
end
```
### Scss テンプレート
Scssテンプレートを使うにはsassライブラリが必要です:
``` ruby
# hamlかsassを読み込みます
require 'sass'
get '/stylesheet.css' do
scss :stylesheet
end
```
`./views/stylesheet.scss`を表示します。
@ -339,22 +369,26 @@ options](http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options)
Configurations](http://www.sinatrarb.com/configuration.html),
を参照してそれぞれ設定を上書きして下さい。
``` ruby
set :scss, :style => :compact # デフォルトのScss styleは:nested
get '/stylesheet.css' do
scss :stylesheet, :style => :expanded # 上書き
end
```
### Less テンプレート
Lessテンプレートを使うにはlessライブラリが必要です:
``` ruby
# lessを読み込みます
require 'less'
get '/stylesheet.css' do
less :stylesheet
end
```
`./views/stylesheet.less`を表示します。
@ -362,70 +396,87 @@ Lessテンプレートを使うにはlessライブラリが必要です:
Liquidテンプレートを使うにはliquidライブラリが必要です:
``` ruby
# liquidを読み込みます
require 'liquid'
get '/' do
liquid :index
end
```
`./views/index.liquid`を表示します。
LiquidテンプレートからRubyのメソッド(`yield`を除く)を呼び出すことができないため、
ほぼ全ての場合にlocalsを指定する必要があるでしょう:
``` ruby
liquid :index, :locals => { :key => 'value' }
```
### Markdown テンプレート
Markdownテンプレートを使うにはrdiscountライブラリが必要です:
``` ruby
# rdiscountを読み込みます
require "rdiscount"
get '/' do
markdown :index
end
```
`./views/index.markdown`を表示します。(`md``mkd`も妥当な拡張子です)
markdownからメソッドを呼び出すことも、localsに変数を渡すこともできません。
それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です:
``` ruby
erb :overview, :locals => { :text => markdown(:introduction) }
```
他のテンプレートからmarkdownメソッドを呼び出してもよいことに注意してください:
``` haml
%h1 Hello From Haml!
%p= markdown(:greetings)
```
### Textile テンプレート
Textileテンプレートを使うにはRedClothライブラリが必要です:
``` ruby
# redclothを読み込みます
require "redcloth"
get '/' do
textile :index
end
```
`./views/index.textile`を表示します。
textileからメソッドを呼び出すことも、localsに変数を渡すこともできません。
それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です:
``` ruby
erb :overview, :locals => { :text => textile(:introduction) }
```
他のテンプレートからtextileメソッドを呼び出してもよいことに注意してください:
``` haml
%h1 Hello From Haml!
%p= textile(:greetings)
```
### RDoc テンプレート
RDocテンプレートを使うにはRDocライブラリが必要です:
``` ruby
# rdoc/markup/to_htmlを読み込みます
require "rdoc"
require "rdoc/markup/to_html"
@ -433,47 +484,58 @@ RDocテンプレートを使うにはRDocライブラリが必要です:
get '/' do
rdoc :index
end
```
`./views/index.rdoc`を表示します。
rdocからメソッドを呼び出すことも、localsに変数を渡すこともできません。
それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です:
``` ruby
erb :overview, :locals => { :text => rdoc(:introduction) }
```
他のテンプレートからrdocメソッドを呼び出してもよいことに注意してください:
``` haml
%h1 Hello From Haml!
%p= rdoc(:greetings)
```
### Radius テンプレート
Radiusテンプレートを使うにはradiusライブラリが必要です:
``` ruby
# radiusを読み込みます
require 'radius'
get '/' do
radius :index
end
```
`./views/index.radius`を表示します。
RadiusテンプレートからRubyのメソッド(`yield`を除く)を呼び出すことができないため、
ほぼ全ての場合にlocalsを指定する必要があるでしょう:
``` ruby
radius :index, :locals => { :key => 'value' }
```
### Markaby テンプレート
Markabyテンプレートを使うにはmarkabyライブラリが必要です:
``` ruby
# markabyを読み込みます
require 'markaby'
get '/' do
markaby :index
end
```
`./views/index.mab`を表示します。
@ -481,12 +543,14 @@ Markabyテンプレートを使うにはmarkabyライブラリが必要です:
RABLテンプレートを使うにはrablライブラリが必要です:
``` ruby
# rablを読み込みます
require 'rabl'
get '/' do
rabl :index
end
```
`./views/index.rabl`を表示します。
@ -494,12 +558,14 @@ RABLテンプレートを使うにはrablライブラリが必要です:
Slimテンプレートを使うにはslimライブラリが必要です:
``` ruby
# slimを読み込みます
require 'slim'
get '/' do
slim :index
end
```
`./views/index.slim`を表示します。
@ -507,12 +573,14 @@ Slimテンプレートを使うにはslimライブラリが必要です:
Creoleテンプレートを使うにはcreoleライブラリが必要です:
``` ruby
# creoleを読み込みます
require 'creole'
get '/' do
creole :index
end
```
`./views/index.creole`を表示します。
@ -520,20 +588,24 @@ Creoleテンプレートを使うにはcreoleライブラリが必要です:
CoffeeScriptテンプレートを表示するにはcoffee-scriptライブラリと\`coffee\`バイナリが必要です:
``` ruby
# coffee-scriptを読み込みます
require 'coffee-script'
get '/application.js' do
coffee :application
end
```
`./views/application.coffee`を表示します。
### インラインテンプレート
``` ruby
get '/' do
haml '%div.title Hello World'
end
```
文字列をテンプレートとして表示します。
@ -543,17 +615,21 @@ CoffeeScriptテンプレートを表示するにはcoffee-scriptライブラリ
ルートハンドラでセットされたインスタンス変数は
テンプレート内で直接使うことができます。
``` ruby
get '/:id' do
@foo = Foo.find(params[:id])
haml '%h1= @foo.name'
end
```
ローカル変数を明示的に定義することもできます。
``` ruby
get '/:id' do
foo = Foo.find(params[:id])
haml '%h1= foo.name', :locals => { :foo => foo }
end
```
このやり方は他のテンプレート内で部分テンプレートとして表示する時に典型的に使用されます。
@ -561,6 +637,7 @@ CoffeeScriptテンプレートを表示するにはcoffee-scriptライブラリ
テンプレートはソースファイルの最後で定義することもできます。
``` ruby
require 'rubygems'
require 'sinatra'
@ -576,6 +653,7 @@ CoffeeScriptテンプレートを表示するにはcoffee-scriptライブラリ
@@ index
%div.title Hello world!!!!!
```
注意:
sinatraをrequireするファイル内で定義されたファイル内テンプレートは自動的に読み込まれます。
@ -586,6 +664,7 @@ sinatraをrequireするファイル内で定義されたファイル内テンプ
テンプレートはトップレベルの`template`メソッドで定義することができます。
``` ruby
template :layout do
"%html\n =yield\n"
end
@ -597,19 +676,23 @@ sinatraをrequireするファイル内で定義されたファイル内テンプ
get '/' do
haml :index
end
```
「layout」というテンプレートが存在する場合、そのテンプレートファイルは他のテンプレートが
表示される度に使用されます。`:layout => false`することでlayoutsを無効にできます。
``` ruby
get '/' do
haml :index, :layout => !request.xhr?
end
```
## ヘルパー
トップレベルの`helpers`を使用してルートハンドラやテンプレートで使うヘルパメソッドを
定義できます。
``` ruby
helpers do
def bar(name)
"#{name}bar"
@ -619,6 +702,7 @@ sinatraをrequireするファイル内で定義されたファイル内テンプ
get '/:name' do
bar(params[:name])
end
```
## フィルタ
@ -626,6 +710,7 @@ beforeフィルタはリクエストされたコンテキストを実行する
リクエストとレスポンスを変更することができます。フィルタ内でセットされた
インスタンス変数はルーティングとテンプレートで使用できます。
``` ruby
before do
@note = 'Hi!'
request.path_info = '/foo/bar/baz'
@ -635,19 +720,23 @@ beforeフィルタはリクエストされたコンテキストを実行する
@note #=> 'Hi!'
params[:splat] #=> 'bar/baz'
end
```
afterフィルタは同じコンテキストにあるリクエストの後に評価され、
同じくリクエストとレスポンスを変更することができます。
beforeフィルタとルートで設定されたインスタンス変数は、
afterフィルタからアクセスすることができます:
``` ruby
after do
puts response.status
end
```
フィルタにはオプションとしてパターンを渡すことができ、
この場合はリクエストのパスがパターンにマッチした場合のみフィルタが評価されます:
``` ruby
before '/protected/*' do
authenticate!
end
@ -655,33 +744,45 @@ afterフィルタからアクセスすることができます:
after '/create/:slug' do |slug|
session[:last_slug] = slug
end
```
## 強制終了
ルートかbeforeフィルタ内で直ちに実行を終了する方法:
``` ruby
halt
```
ステータスを指定することができます:
``` ruby
halt 410
```
body部を指定することもできます …
``` ruby
halt 'ここにbodyを書く'
```
ステータスとbody部を指定する …
``` ruby
halt 401, '立ち去れ!'
```
ヘッダを指定:
``` ruby
halt 402, {'Content-Type' => 'text/plain'}, 'リベンジ'
```
## パッシング(Passing)
ルートは`pass`を使って次のルートに飛ばすことができます:
``` ruby
get '/guess/:who' do
pass unless params[:who] == 'Frank'
"見つかっちゃった!"
@ -690,6 +791,7 @@ body部を指定することもできます …
get '/guess/*' do
"はずれです!"
end
```
ルートブロックからすぐに抜け出し、次にマッチするルートを実行します。
マッチするルートが見当たらない場合は404が返されます。
@ -698,6 +800,7 @@ body部を指定することもできます …
受信するリクエストオブジェクトは、\`request\`メソッドを通じてリクエストレベル(フィルタ、ルート、エラーハンドラ)からアクセスすることができます:
``` ruby
# アプリケーションが http://example.com/example で動作している場合
get '/foo' do
request.body # クライアントによって送信されたリクエストボディ(下記参照)
@ -723,42 +826,53 @@ body部を指定することもできます …
request.secure? # false
request.env # Rackによって渡された生のenvハッシュ
end
```
`script_name``path_info`などのオプションは次のように利用することもできます:
``` ruby
before { request.path_info = "/" }
get "/" do
"全てのリクエストはここに来る"
end
```
`request.body`はIOまたはStringIOのオブジェクトです:
``` ruby
post "/api" do
request.body.rewind # 既に読まれているときのため
data = JSON.parse request.body.read
"Hello #{data['name']}!"
end
```
## 設定
どの環境でも起動時に1回だけ実行されます。
``` ruby
configure do
...
end
```
環境(RACK\_ENV環境変数)が`:production`に設定されている時だけ実行する方法:
``` ruby
configure :production do
...
end
```
環境が`:production``:test`の場合に設定する方法:
``` ruby
configure :production, :test do
...
end
```
## エラーハンドリング
@ -770,9 +884,11 @@ body部を指定することもできます …
`Sinatra::NotFound`が起きた時か レスポンスのステータスコードが
404の時に`not_found`ハンドラーが発動します。
``` ruby
not_found do
'ファイルが存在しません'
end
```
### エラー
@ -780,28 +896,37 @@ body部を指定することもできます …
ハンドラーはルートブロックかbeforeフィルタ内で例外が発生した時はいつでも発動します。
例外オブジェクトはRack変数`sinatra.error`から取得できます。
``` ruby
error do
'エラーが発生しました。 - ' + env['sinatra.error'].name
end
```
エラーをカスタマイズする場合は、
``` ruby
error MyCustomError do
'エラーメッセージ...' + env['sinatra.error'].message
end
```
と書いておいて,下記のように呼び出します。
``` ruby
get '/' do
raise MyCustomError, '何かがまずかったようです'
end
```
そうするとこうなります:
```
エラーメッセージ... 何かがまずかったようです
```
あるいは、ステータスコードに対応するエラーハンドラを設定することもできます:
``` ruby
error 403 do
'Access forbidden'
end
@ -809,12 +934,15 @@ body部を指定することもできます …
get '/secret' do
403
end
```
範囲指定もできます:
``` ruby
error 400..510 do
'Boom'
end
```
開発環境として実行している場合、Sinatraは特別な`not_found``error`ハンドラーを
インストールしています。
@ -824,11 +952,15 @@ body部を指定することもできます …
`send_file`か静的ファイルを使う時、Sinatraが理解でいないMIMEタイプがある場合があります。
その時は `mime_type` を使ってファイル拡張子毎に登録して下さい。
``` ruby
mime_type :foo, 'text/foo'
```
これはcontent\_typeヘルパで利用することができます:
``` ruby
content_type :foo
```
## Rackミドルウェア
@ -841,6 +973,7 @@ body部を指定することもできます …
Sinatraではトップレベルの`use`
メソッドを使ってRackにパイプラインを構築します。
``` ruby
require 'sinatra'
require 'my_custom_middleware'
@ -850,15 +983,18 @@ Sinatraではトップレベルの`use`
get '/hello' do
'Hello World'
end
```
`use`
[Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html)
DSLで定義されていることと全て一致します。 例えば `use`
メソッドはブロック構文のように複数の引数を受け取ることができます。
``` ruby
use Rack::Auth::Basic do |username, password|
username == 'admin' && password == 'secret'
end
```
Rackはログ、デバッギング、URLルーティング、認証、セッションなどいろいろな機能を備えた標準的ミドルウェアです。
Sinatraはその多くのコンポーネントを自動で使うよう基本設定されているため、`use`で明示的に指定する必要はありません。
@ -869,6 +1005,7 @@ SinatraでのテストはRack-basedのテストライブラリかフレームワ
[Rack::Test](http://gitrdoc.com/brynary/rack-test)
をおすすめします。やり方:
``` ruby
require 'my_sinatra_app'
require 'rack/test'
@ -894,6 +1031,7 @@ SinatraでのテストはRack-basedのテストライブラリかフレームワ
assert_equal "あなたはSongbirdを使ってますね!", last_response.body
end
end
```
注意: ビルトインのSinatra::TestモジュールとSinatra::TestHarnessクラスは
0.9.2リリース以降、廃止予定になっています。
@ -906,6 +1044,7 @@ RackミドルウェアやRails metal、サーバのコンポーネントを含
トップレベルのDSLがネームスペースを汚染したり、設定を変えてしまうこと(例:./publicや./view)がありえます。
そこでSinatra::Baseの出番です。
``` ruby
require 'sinatra/base'
class MyApp < Sinatra::Base
@ -916,13 +1055,16 @@ RackミドルウェアやRails metal、サーバのコンポーネントを含
'Hello world!'
end
end
```
このMyAppは独立したRackコンポーネントで、RackミドルウェアやRackアプリケーション
Rails metalとして使用することができます。`config.ru`ファイル内で `use`
か、または `run`
でこのクラスを指定するか、ライブラリとしてサーバコンポーネントをコントロールします。
``` ruby
MyApp.run! :host => 'localhost', :port => 9090
```
Sinatra::Baseのサブクラスで使えるメソッドはトップレベルのDSLを経由して確実に使うことができます。
ほとんどのトップレベルで記述されたアプリは、以下の点を修正することでSinatra::Baseコンポーネントに変えることができます。
@ -956,6 +1098,7 @@ Sinatraは他のRackミドルウェアを利用することができるだけで
このエンドポイントには、別のSinatraアプリケーションまたは他のRackベースのアプリケーション(Rails/Ramaze/Camping/…)が用いられるでしょう。
``` ruby
require 'sinatra/base'
class LoginScreen < Sinatra::Base
@ -984,6 +1127,7 @@ Sinatraは他のRackミドルウェアを利用することができるだけで
get('/') { "Hello #{session['user_name']}." }
end
```
## スコープとバインディング
@ -999,6 +1143,7 @@ Sinatraは他のRackミドルウェアを利用することができるだけで
\`set\`によって作られたオプションはクラスレベルのメソッドです:
``` ruby
class MyApp < Sinatra::Base
# Hey, I'm in the application scope!
set :foo, 42
@ -1008,6 +1153,7 @@ Sinatraは他のRackミドルウェアを利用することができるだけで
# Hey, I'm no longer in the application scope!
end
end
```
次の場所ではアプリケーションスコープバインディングを持ちます:
@ -1031,6 +1177,7 @@ Sinatraは他のRackミドルウェアを利用することができるだけで
このスコープの内側からは\`request\`や\`session\`オブジェクトにアクセスすることができ、\`erb\`や\`haml\`のような表示メソッドを呼び出すことができます。
リクエストスコープの内側からは、\`settings\`ヘルパによってアプリケーションスコープにアクセスすることができます。
``` ruby
class MyApp < Sinatra::Base
# Hey, I'm in the application scope!
get '/define_route/:name' do
@ -1045,6 +1192,7 @@ Sinatraは他のRackミドルウェアを利用することができるだけで
"Route defined!"
end
end
```
次の場所ではリクエストスコープバインディングを持ちます:
@ -1079,7 +1227,9 @@ mixin](http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606
Sinatraアプリケーションは直接実行できます。
``` shell
ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
```
オプション:
@ -1095,12 +1245,15 @@ Sinatraアプリケーションは直接実行できます。
Sinatraの開発版を使いたい場合は、ローカルに開発版を落として、
`LOAD_PATH``sinatra/lib`ディレクトリを指定して実行して下さい。
``` shell
cd myapp
git clone git://github.com/sinatra/sinatra.git
ruby -Isinatra/lib myapp.rb
```
`sinatra/lib`ディレクトリをアプリケーションの`LOAD_PATH`に追加する方法もあります。
``` ruby
$LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
require 'rubygems'
require 'sinatra'
@ -1108,11 +1261,14 @@ Sinatraの開発版を使いたい場合は、ローカルに開発版を落と
get '/about' do
"今使ってるバージョンは" + Sinatra::VERSION
end
```
Sinatraのソースを更新する方法:
``` shell
cd myproject/sinatra
git pull
```
## その他