sinatra 1.0 → 1.1.a

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sinatra might be problematic. Click here for more details.

Files changed (57) hide show
  1. data/CHANGES +108 -1
  2. data/LICENSE +1 -1
  3. data/README.de.rdoc +1024 -0
  4. data/README.es.rdoc +1047 -0
  5. data/README.fr.rdoc +1038 -0
  6. data/README.hu.rdoc +607 -0
  7. data/README.jp.rdoc +473 -15
  8. data/README.rdoc +429 -41
  9. data/Rakefile +17 -6
  10. data/lib/sinatra/base.rb +357 -158
  11. data/lib/sinatra/showexceptions.rb +9 -1
  12. data/sinatra.gemspec +52 -9
  13. data/test/builder_test.rb +25 -1
  14. data/test/coffee_test.rb +88 -0
  15. data/test/encoding_test.rb +18 -0
  16. data/test/filter_test.rb +61 -2
  17. data/test/hello.mab +1 -0
  18. data/test/helper.rb +1 -0
  19. data/test/helpers_test.rb +141 -37
  20. data/test/less_test.rb +26 -2
  21. data/test/liquid_test.rb +58 -0
  22. data/test/markaby_test.rb +58 -0
  23. data/test/markdown_test.rb +35 -0
  24. data/test/nokogiri_test.rb +69 -0
  25. data/test/radius_test.rb +59 -0
  26. data/test/rdoc_test.rb +34 -0
  27. data/test/request_test.rb +12 -0
  28. data/test/routing_test.rb +35 -1
  29. data/test/sass_test.rb +46 -16
  30. data/test/scss_test.rb +88 -0
  31. data/test/settings_test.rb +32 -0
  32. data/test/sinatra_test.rb +4 -0
  33. data/test/static_test.rb +64 -0
  34. data/test/templates_test.rb +55 -1
  35. data/test/textile_test.rb +34 -0
  36. data/test/views/ascii.haml +2 -0
  37. data/test/views/explicitly_nested.str +1 -0
  38. data/test/views/hello.coffee +1 -0
  39. data/test/views/hello.liquid +1 -0
  40. data/test/views/hello.mab +1 -0
  41. data/test/views/hello.md +1 -0
  42. data/test/views/hello.nokogiri +1 -0
  43. data/test/views/hello.radius +1 -0
  44. data/test/views/hello.rdoc +1 -0
  45. data/test/views/hello.sass +1 -1
  46. data/test/views/hello.scss +3 -0
  47. data/test/views/hello.str +1 -0
  48. data/test/views/hello.textile +1 -0
  49. data/test/views/layout2.liquid +2 -0
  50. data/test/views/layout2.mab +2 -0
  51. data/test/views/layout2.nokogiri +3 -0
  52. data/test/views/layout2.radius +2 -0
  53. data/test/views/layout2.str +2 -0
  54. data/test/views/nested.str +1 -0
  55. data/test/views/utf8.haml +2 -0
  56. metadata +240 -33
  57. data/lib/sinatra/tilt.rb +0 -746
@@ -1,9 +1,9 @@
1
1
  = Sinatra
2
+ <i>注) 本文書は英語から翻訳したものであり、その内容が最新でない場合もあります。最新の情報はオリジナルの英語版を参照して下さい。</i>
2
3
 
3
4
  SinatraはRubyで下記のような最小労力で手早くウェブアプリケーションを作成するためのDSLです。
4
5
 
5
6
  # myapp.rb
6
- require 'rubygems'
7
7
  require 'sinatra'
8
8
  get '/' do
9
9
  'Hello world!'
@@ -11,8 +11,8 @@ SinatraはRubyで下記のような最小労力で手早くウェブアプリケ
11
11
 
12
12
  gemをインストールして動かしてみる。
13
13
 
14
- sudo gem install sinatra
15
- ruby myapp.rb
14
+ gem install sinatra
15
+ ruby -rubygems myapp.rb
16
16
 
17
17
  http://localhost:4567 を見る。
18
18
 
@@ -79,6 +79,9 @@ Sinatraでは、ルートはHTTPメソッドとURLマッチングパターンが
79
79
  "Hello, #{c}!"
80
80
  end
81
81
 
82
+
83
+ === 条件
84
+
82
85
  ルートにはユーザエージェントのようなさまざまな条件を含めることができます。
83
86
 
84
87
  get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
@@ -89,6 +92,58 @@ Sinatraでは、ルートはHTTPメソッドとURLマッチングパターンが
89
92
  # Matches non-songbird browsers
90
93
  end
91
94
 
95
+ ほかに+host_name+と+provides+条件が利用可能です:
96
+
97
+ get '/', :host_name => /^admin\./ do
98
+ "Admin Area, Access denied!"
99
+ end
100
+
101
+ get '/', :provides => 'html' do
102
+ haml :index
103
+ end
104
+
105
+ get '/', :provides => ['rss', 'atom', 'xml'] do
106
+ builder :feed
107
+ end
108
+
109
+ 独自の条件を定義することも簡単にできます:
110
+
111
+ set(:probability) { |value| condition { rand <= value } }
112
+
113
+ get '/win_a_car', :probability => 0.1 do
114
+ "You won!"
115
+ end
116
+
117
+ get '/win_a_car' do
118
+ "Sorry, you lost."
119
+ end
120
+
121
+
122
+ === 戻り値
123
+
124
+ ルートブロックの戻り値は、HTTPクライアントまたはRackスタックでの次のミドルウェアに渡されるレスポンスボディを決定します。
125
+
126
+ これは大抵の場合、上の例のように文字列ですが、それ以外の値も使用することができます。
127
+
128
+ Rackレスポンス、Rackボディオブジェクト、HTTPステータスコードのいずれかとして
129
+ 妥当なオブジェクトであればどのようなオブジェクトでも返すことができます:
130
+
131
+ * 3要素の配列: <tt>[ステータス(Fixnum), ヘッダ(Hash), レスポンスボディ(#eachに応答する)]</tt>
132
+ * 2要素の配列: <tt>[ステータス(Fixnum), レスポンスボディ(#eachに応答する)]</tt>
133
+ * <tt>#each</tt>に応答し、与えられたブロックに文字列を渡すオブジェクト
134
+ * ステータスコードを表現するFixnum
135
+
136
+ そのように、例えばストリーミングの例を簡単に実装することができます:
137
+
138
+ class Stream
139
+ def each
140
+ 100.times { |i| yield "#{i}\n" }
141
+ end
142
+ end
143
+
144
+ get('/') { Stream.new }
145
+
146
+
92
147
  == 静的ファイル
93
148
 
94
149
  静的ファイルは<tt>./public</tt>ディレクトリから配信されます。
@@ -123,7 +178,7 @@ hamlを使うにはhamlライブラリが必要です:
123
178
 
124
179
  <tt>./views/index.haml</tt>を表示します。
125
180
 
126
- {Haml's options}[http://haml.hamptoncatlin.com/docs/rdoc/classes/Haml.html]
181
+ {Haml's options}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
127
182
  はSinatraの設定でグローバルに設定することができます。
128
183
  {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
129
184
  を参照してそれぞれ設定を上書きして下さい。
@@ -146,6 +201,19 @@ hamlを使うにはhamlライブラリが必要です:
146
201
 
147
202
  <tt>./views/index.erb</tt>を表示します。
148
203
 
204
+ === Erubis
205
+
206
+ erubisテンプレートを表示するには、erubisライブラリが必要です:
207
+
208
+ ## erubisを読み込みます
209
+ require 'erubis'
210
+
211
+ get '/' do
212
+ erubis :index
213
+ end
214
+
215
+ <tt>./views/index.erubis</tt>を表示します。
216
+
149
217
  === Builder テンプレート
150
218
 
151
219
  builderを使うにはbuilderライブラリが必要です:
@@ -154,12 +222,24 @@ builderを使うにはbuilderライブラリが必要です:
154
222
  require 'builder'
155
223
 
156
224
  get '/' do
157
- content_type 'application/xml', :charset => 'utf-8'
158
225
  builder :index
159
226
  end
160
227
 
161
228
  <tt>./views/index.builder</tt>を表示します。
162
229
 
230
+ === 鋸 テンプレート
231
+
232
+ 鋸を使うには鋸ライブラリが必要です:
233
+
234
+ ## 鋸を読み込みます
235
+ require 'nokogiri'
236
+
237
+ get '/' do
238
+ nokogiri :index
239
+ end
240
+
241
+ <tt>./views/index.nokogiri</tt>を表示します。
242
+
163
243
  === Sass テンプレート
164
244
 
165
245
  Sassテンプレートを使うにはsassライブラリが必要です:
@@ -168,13 +248,12 @@ Sassテンプレートを使うにはsassライブラリが必要です:
168
248
  require 'sass'
169
249
 
170
250
  get '/stylesheet.css' do
171
- content_type 'text/css', :charset => 'utf-8'
172
251
  sass :stylesheet
173
252
  end
174
253
 
175
254
  <tt>./views/stylesheet.sass</tt>を表示します。
176
255
 
177
- {Sass' options}[http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html]
256
+ {Sass' options}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
178
257
  はSinatraの設定でグローバルに設定することができます。
179
258
  see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
180
259
  を参照してそれぞれ設定を上書きして下さい。
@@ -182,10 +261,176 @@ see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
182
261
  set :sass, {:style => :compact } # デフォルトのSass styleは :nested
183
262
 
184
263
  get '/stylesheet.css' do
185
- content_type 'text/css', :charset => 'utf-8'
186
264
  sass :stylesheet, :sass_options => {:style => :expanded } # 上書き
187
265
  end
188
266
 
267
+ === Scss テンプレート
268
+
269
+ Scssテンプレートを使うにはsassライブラリが必要です:
270
+
271
+ ## hamlかsassを読み込みます
272
+ require 'sass'
273
+
274
+ get '/stylesheet.css' do
275
+ scss :stylesheet
276
+ end
277
+
278
+ <tt>./views/stylesheet.scss</tt>を表示します。
279
+
280
+ {Sass' options}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
281
+ はSinatraの設定でグローバルに設定することができます。
282
+ see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
283
+ を参照してそれぞれ設定を上書きして下さい。
284
+
285
+ set :scss, :style => :compact # デフォルトのScss styleは:nested
286
+
287
+ get '/stylesheet.css' do
288
+ scss :stylesheet, :style => :expanded # 上書き
289
+ end
290
+
291
+ === Less テンプレート
292
+
293
+ Lessテンプレートを使うにはlessライブラリが必要です:
294
+
295
+ ## lessを読み込みます
296
+ require 'less'
297
+
298
+ get '/stylesheet.css' do
299
+ less :stylesheet
300
+ end
301
+
302
+ <tt>./views/stylesheet.less</tt>を表示します。
303
+
304
+ === Liquid テンプレート
305
+
306
+ Liquidテンプレートを使うにはliquidライブラリが必要です:
307
+
308
+ ## liquidを読み込みます
309
+ require 'liquid'
310
+
311
+ get '/' do
312
+ liquid :index
313
+ end
314
+
315
+ <tt>./views/index.liquid</tt>を表示します。
316
+
317
+ LiquidテンプレートからRubyのメソッド(+yield+を除く)を呼び出すことができないため、
318
+ ほぼ全ての場合にlocalsを指定する必要があるでしょう:
319
+
320
+ liquid :index, :locals => { :key => 'value' }
321
+
322
+ === Markdown テンプレート
323
+
324
+ Markdownテンプレートを使うにはrdiscountライブラリが必要です:
325
+
326
+ ## rdiscountを読み込みます
327
+ require "rdiscount"
328
+
329
+ get '/' do
330
+ markdown :index
331
+ end
332
+
333
+ <tt>./views/index.markdown</tt>を表示します。(+md+と+mkd+も妥当な拡張子です)
334
+
335
+ markdownからメソッドを呼び出すことも、localsに変数を渡すこともできません。
336
+ それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です:
337
+
338
+ erb :overview, :locals => { :text => markdown(:introduction) }
339
+
340
+ 他のテンプレートからmarkdownメソッドを呼び出してもよいことに注意してください:
341
+
342
+ %h1 Hello From Haml!
343
+ %p= markdown(:greetings)
344
+
345
+ === Textile テンプレート
346
+
347
+ Textileテンプレートを使うにはRedClothライブラリが必要です:
348
+
349
+ ## redclothを読み込みます
350
+ require "redcloth"
351
+
352
+ get '/' do
353
+ textile :index
354
+ end
355
+
356
+ <tt>./views/index.textile</tt>を表示します。
357
+
358
+ textileからメソッドを呼び出すことも、localsに変数を渡すこともできません。
359
+ それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です:
360
+
361
+ erb :overview, :locals => { :text => textile(:introduction) }
362
+
363
+ 他のテンプレートからtextileメソッドを呼び出してもよいことに注意してください:
364
+
365
+ %h1 Hello From Haml!
366
+ %p= textile(:greetings)
367
+
368
+ === RDoc テンプレート
369
+
370
+ RDocテンプレートを使うにはRDocライブラリが必要です:
371
+
372
+ ## rdocを読み込みます
373
+ require "rdoc"
374
+
375
+ get '/' do
376
+ rdoc :index
377
+ end
378
+
379
+ <tt>./views/index.rdoc</tt>を表示します。
380
+
381
+ rdocからメソッドを呼び出すことも、localsに変数を渡すこともできません。
382
+ それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です:
383
+
384
+ erb :overview, :locals => { :text => rdoc(:introduction) }
385
+
386
+ 他のテンプレートからrdocメソッドを呼び出してもよいことに注意してください:
387
+
388
+ %h1 Hello From Haml!
389
+ %p= rdoc(:greetings)
390
+
391
+ === Radius テンプレート
392
+
393
+ Radiusテンプレートを使うにはradiusライブラリが必要です:
394
+
395
+ ## radiusを読み込みます
396
+ require 'radius'
397
+
398
+ get '/' do
399
+ radius :index
400
+ end
401
+
402
+ <tt>./views/index.radius</tt>を表示します。
403
+
404
+ RadiusテンプレートからRubyのメソッド(+yield+を除く)を呼び出すことができないため、
405
+ ほぼ全ての場合にlocalsを指定する必要があるでしょう:
406
+
407
+ radius :index, :locals => { :key => 'value' }
408
+
409
+ === Markaby テンプレート
410
+
411
+ Markabyテンプレートを使うにはmarkabyライブラリが必要です:
412
+
413
+ ## markabyを読み込みます
414
+ require 'markaby'
415
+
416
+ get '/' do
417
+ markaby :index
418
+ end
419
+
420
+ <tt>./views/index.mab</tt>を表示します。
421
+
422
+ === CoffeeScript テンプレート
423
+
424
+ CoffeeScriptテンプレートを表示するにはcoffee-scriptライブラリと`coffee`バイナリが必要です:
425
+
426
+ ## coffee-scriptを読み込みます
427
+ require 'coffee-script'
428
+
429
+ get '/application.js' do
430
+ coffee :application
431
+ end
432
+
433
+ <tt>./views/application.coffee</tt>を表示します。
189
434
 
190
435
  === インラインテンプレート
191
436
 
@@ -235,7 +480,7 @@ see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
235
480
  %div.title Hello world!!!!!
236
481
 
237
482
  注意: sinatraをrequireするファイル内で定義されたファイル内テンプレートは自動的に読み込まれます。
238
- 他のファイルで定義されているテンプレートを使うには <tt>use_in_file_templates!</tt>メソッドで指定します。
483
+ 他のファイルで定義されているテンプレートを使うには <tt>enable :inline_templates</tt>を明示的に呼んでください。
239
484
 
240
485
  === 名前付きテンプレート
241
486
 
@@ -254,7 +499,7 @@ see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
254
499
  end
255
500
 
256
501
  「layout」というテンプレートが存在する場合、そのテンプレートファイルは他のテンプレートが
257
- 表示される度に使用されます。<tt>:layout => false</tt>.することでlayoutsを無効にできます。
502
+ 表示される度に使用されます。<tt>:layout => false</tt>することでlayoutsを無効にできます。
258
503
 
259
504
  get '/' do
260
505
  haml :index, :layout => !request.xhr?
@@ -291,12 +536,36 @@ beforeフィルタはリクエストされたコンテキストを実行する
291
536
  params[:splat] #=> 'bar/baz'
292
537
  end
293
538
 
539
+ afterフィルタは同じコンテキストにあるリクエストの後に評価され、
540
+ 同じくリクエストとレスポンスを変更することができます。
541
+ beforeフィルタとルートで設定されたインスタンス変数は、
542
+ afterフィルタからアクセスすることができます:
543
+
544
+ after do
545
+ puts response.status
546
+ end
547
+
548
+ フィルタにはオプションとしてパターンを渡すことができ、
549
+ この場合はリクエストのパスがパターンにマッチした場合のみフィルタが評価されます:
550
+
551
+ before '/protected/*' do
552
+ authenticate!
553
+ end
554
+
555
+ after '/create/:slug' do |slug|
556
+ session[:last_slug] = slug
557
+ end
558
+
294
559
  == 強制終了
295
560
 
296
561
  ルートかbeforeフィルタ内で直ちに実行を終了する方法:
297
562
 
298
563
  halt
299
564
 
565
+ ステータスを指定することができます:
566
+
567
+ halt 410
568
+
300
569
  body部を指定することもできます ...
301
570
 
302
571
  halt 'ここにbodyを書く'
@@ -305,6 +574,10 @@ body部を指定することもできます ...
305
574
 
306
575
  halt 401, '立ち去れ!'
307
576
 
577
+ ヘッダを指定:
578
+
579
+ halt 402, {'Content-Type' => 'text/plain'}, 'リベンジ'
580
+
308
581
  == パッシング(Passing)
309
582
 
310
583
  ルートは<tt>pass</tt>を使って次のルートに飛ばすことができます:
@@ -321,6 +594,53 @@ body部を指定することもできます ...
321
594
  ルートブロックからすぐに抜け出し、次にマッチするルートを実行します。
322
595
  マッチするルートが見当たらない場合は404が返されます。
323
596
 
597
+ == リクエストオブジェクトへのアクセス
598
+
599
+ 受信するリクエストオブジェクトは、`request`メソッドを通じてリクエストレベル(フィルタ、ルート、エラーハンドラ)からアクセスすることができます:
600
+
601
+ # アプリケーションが http://example.com/example で動作している場合
602
+ get '/foo' do
603
+ request.body # クライアントによって送信されたリクエストボディ(下記参照)
604
+ request.scheme # "http"
605
+ request.script_name # "/example"
606
+ request.path_info # "/foo"
607
+ request.port # 80
608
+ request.request_method # "GET"
609
+ request.query_string # ""
610
+ request.content_length # request.bodyの長さ
611
+ request.media_type # request.bodyのメディアタイプ
612
+ request.host # "example.com"
613
+ request.get? # true (他の動詞についても同様のメソッドあり)
614
+ request.form_data? # false
615
+ request["SOME_HEADER"] # SOME_HEADERヘッダの値
616
+ request.referer # クライアントのリファラまたは'/'
617
+ request.user_agent # ユーザエージェント (:agent 条件によって使用される)
618
+ request.cookies # ブラウザクッキーのハッシュ
619
+ request.xhr? # Ajaxリクエストかどうか
620
+ request.url # "http://example.com/example/foo"
621
+ request.path # "/example/foo"
622
+ request.ip # クライアントのIPアドレス
623
+ request.secure? # false
624
+ request.env # Rackによって渡された生のenvハッシュ
625
+ end
626
+
627
+ <tt>script_name</tt>や<tt>path_info</tt>などのオプションは次のように利用することもできます:
628
+
629
+ before { request.path_info = "/" }
630
+
631
+ get "/" do
632
+ "全てのリクエストはここに来る"
633
+ end
634
+
635
+ <tt>request.body</tt>はIOまたはStringIOのオブジェクトです:
636
+
637
+ post "/api" do
638
+ request.body.rewind # 既に読まれているときのため
639
+ data = JSON.parse request.body.read
640
+ "Hello #{data['name']}!"
641
+ end
642
+
643
+
324
644
  == 設定
325
645
 
326
646
  どの環境でも起動時に1回だけ実行されます。
@@ -329,13 +649,13 @@ body部を指定することもできます ...
329
649
  ...
330
650
  end
331
651
 
332
- 環境変数<tt>:production</tt>(RACK_ENV環境変数) がセットされている時だけ実行する方法:
652
+ 環境(RACK_ENV環境変数)が<tt>:production</tt>に設定されている時だけ実行する方法:
333
653
 
334
654
  configure :production do
335
655
  ...
336
656
  end
337
657
 
338
- 環境変数<tt>:production</tt> か<tt>:test</tt>の場合に設定する方法:
658
+ 環境が<tt>:production</tt>か<tt>:test</tt>の場合に設定する方法:
339
659
 
340
660
  configure :production, :test do
341
661
  ...
@@ -358,7 +678,7 @@ body部を指定することもできます ...
358
678
  === エラー
359
679
 
360
680
  +error+ ハンドラーはルートブロックかbeforeフィルタ内で例外が発生した時はいつでも発動します。
361
- block or before filter. 例外オブジェクトはRack変数<tt>sinatra.error</tt>から取得されます。
681
+ 例外オブジェクトはRack変数<tt>sinatra.error</tt>から取得できます。
362
682
 
363
683
  error do
364
684
  'エラーが発生しました。 - ' + env['sinatra.error'].name
@@ -380,6 +700,23 @@ block or before filter. 例外オブジェクトはRack変数<tt>sinatra.error</
380
700
 
381
701
  エラーメッセージ... 何かがまずかったようです
382
702
 
703
+ あるいは、ステータスコードに対応するエラーハンドラを設定することもできます:
704
+
705
+ error 403 do
706
+ 'Access forbidden'
707
+ end
708
+
709
+ get '/secret' do
710
+ 403
711
+ end
712
+
713
+ 範囲指定もできます:
714
+
715
+ error 400..510 do
716
+ 'Boom'
717
+ end
718
+
719
+
383
720
  開発環境として実行している場合、Sinatraは特別な<tt>not_found</tt>と<tt>error</tt>ハンドラーを
384
721
  インストールしています。
385
722
 
@@ -390,6 +727,10 @@ block or before filter. 例外オブジェクトはRack変数<tt>sinatra.error</
390
727
 
391
728
  mime_type :foo, 'text/foo'
392
729
 
730
+ これはcontent_typeヘルパで利用することができます:
731
+
732
+ content_type :foo
733
+
393
734
  == Rackミドルウェア
394
735
 
395
736
  SinatraはRack[http://rack.rubyforge.org/]というRubyのWEBフレームワーク用の
@@ -496,16 +837,133 @@ Sinatra::Baseのサブクラスで使えるメソッドはトップレベルのD
496
837
  {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1064]
497
838
  {included into the main namespace}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/main.rb#L25].
498
839
 
840
+ === Sinatraをミドルウェアとして利用する
841
+
842
+ Sinatraは他のRackミドルウェアを利用することができるだけでなく、
843
+ 全てのSinatraアプリケーションは、それ自体ミドルウェアとして別のRackエンドポイントの前に追加することが可能です。
844
+
845
+ このエンドポイントには、別のSinatraアプリケーションまたは他のRackベースのアプリケーション(Rails/Ramaze/Camping/...)が用いられるでしょう。
846
+
847
+ require 'sinatra/base'
848
+
849
+ class LoginScreen < Sinatra::Base
850
+ enable :session
851
+
852
+ get('/login') { haml :login }
853
+
854
+ post('/login') do
855
+ if params[:name] = 'admin' and params[:password] = 'admin'
856
+ session['user_name'] = params[:name]
857
+ else
858
+ redirect '/login'
859
+ end
860
+ end
861
+ end
862
+
863
+ class MyApp < Sinatra::Base
864
+ # middleware will run before filters
865
+ use LoginScreen
866
+
867
+ before do
868
+ unless session['user_name']
869
+ halt "Access denied, please <a href='/login'>login</a>."
870
+ end
871
+ end
872
+
873
+ get('/') { "Hello #{session['user_name']}." }
874
+ end
875
+
876
+ == スコープとバインディング
877
+
878
+ 現在のスコープはどのメソッドや変数が利用可能かを決定します。
879
+
880
+ === アプリケーション/クラスのスコープ
881
+
882
+ 全てのSinatraアプリケーションはSinatra::Baseのサブクラスに相当します。
883
+ もしトップレベルDSLを利用しているならば(<tt>require 'sinatra'</tt>)このクラスはSinatra::Applicationであり、
884
+ そうでなければ、あなたが明示的に作成したサブクラスです。
885
+ クラスレベルでは`get`や`before`のようなメソッドを持っています。
886
+ しかし`request`オブジェクトや`session`には、全てのリクエストのために1つのアプリケーションクラスが存在するためアクセスできません。
887
+
888
+ `set`によって作られたオプションはクラスレベルのメソッドです:
889
+
890
+ class MyApp < Sinatra::Base
891
+ # Hey, I'm in the application scope!
892
+ set :foo, 42
893
+ foo # => 42
894
+
895
+ get '/foo' do
896
+ # Hey, I'm no longer in the application scope!
897
+ end
898
+ end
899
+
900
+ 次の場所ではアプリケーションスコープバインディングを持ちます:
901
+
902
+ * アプリケーションのクラス本体
903
+ * 拡張によって定義されたメソッド
904
+ * `helpers`に渡されたブロック
905
+ * `set`の値として使われるProcまたはブロック
906
+
907
+ このスコープオブジェクト(クラス)は次のように利用できます:
908
+
909
+ * configureブロックに渡されたオブジェクト経由(<tt>configure { |c| ... }</tt>)
910
+ * リクエストスコープの中での`settings`
911
+
912
+ === リクエスト/インスタンスのスコープ
913
+
914
+ やってくるリクエストごとに、あなたのアプリケーションクラスの新しいインスタンスが作成され、全てのハンドラブロックがそのスコープで実行されます。
915
+ このスコープの内側からは`request`や`session`オブジェクトにアクセスすることができ、`erb`や`haml`のような表示メソッドを呼び出すことができます。
916
+ リクエストスコープの内側からは、`settings`ヘルパによってアプリケーションスコープにアクセスすることができます。
917
+
918
+ class MyApp << Sinatra::Base
919
+ # Hey, I'm in the application scope!
920
+ get '/define_route/:name' do
921
+ # Request scope for '/define_route/:name'
922
+ @value = 42
923
+
924
+ settings.get("/#{params[:name]}") do
925
+ # Request scope for "/#{params[:name]}"
926
+ @value # => nil (not the same request)
927
+ end
928
+
929
+ "Route defined!"
930
+ end
931
+ end
932
+
933
+ 次の場所ではリクエストスコープバインディングを持ちます:
934
+
935
+ * get/head/post/put/delete ブロック
936
+ * before/after フィルタ
937
+ * helper メソッド
938
+ * テンプレート/ビュー
939
+
940
+ === デリゲートスコープ
941
+
942
+ デリゲートスコープは、単にクラススコープにメソッドを転送します。
943
+ しかしながら、クラスのバインディングを持っていないため、クラススコープと全く同じふるまいをするわけではありません:
944
+ 委譲すると明示的に示されたメソッドのみが利用可能であり、またクラススコープと変数/状態を共有することはできません(注: 異なった`self`を持っています)。
945
+ <tt>Sinatra::Delegator.delegate :method_name</tt>を呼び出すことによってデリゲートするメソッドを明示的に追加することができます。
946
+
947
+ 次の場所ではデリゲートスコープを持ちます:
948
+
949
+ * もし<tt>require "sinatra"</tt>しているならば、トップレベルバインディング
950
+ * `Sinatra::Delegator` mixinでextendされたオブジェクト
951
+
952
+ コードをご覧ください: ここでは
953
+ {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
954
+ は{main 名前空間にincludeされています}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28].
955
+
499
956
  == コマンドライン
500
957
 
501
958
  Sinatraアプリケーションは直接実行できます。
502
959
 
503
- ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-s HANDLER]
960
+ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
504
961
 
505
962
  オプション:
506
963
 
507
964
  -h # ヘルプ
508
965
  -p # ポート指定(デフォルトは4567)
966
+ -o # ホスト指定(デフォルトは0.0.0.0)
509
967
  -e # 環境を指定 (デフォルトはdevelopment)
510
968
  -s # rackserver/handlerを指定 (デフォルトはthin)
511
969
  -x # mutex lockを付ける (デフォルトはoff)
@@ -546,7 +1004,7 @@ Sinatraのソースを更新する方法:
546
1004
  ニュース、他のリソースへのリンクがあります。
547
1005
  * {プロジェクトに参加(貢献)する}[http://sinatra.github.com/contributing.html] - バグレポート
548
1006
  パッチの送信、サポートなど
549
- * {Lighthouse}[http://sinatra.lighthouseapp.com] - チケット管理とリリース計画
1007
+ * {Issue tracker}[http://github.com/sinatra/sinatra/issues] - チケット管理とリリース計画
550
1008
  * {Twitter}[http://twitter.com/sinatra]
551
1009
  * {メーリングリスト}[http://groups.google.com/group/sinatrarb]
552
1010
  * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] on http://freenode.net