sinatra 1.4.6 → 2.0.0

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 (125) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHORS.md +5 -2
  3. data/{CHANGES → CHANGELOG.md} +126 -46
  4. data/CONTRIBUTING.md +100 -0
  5. data/Gemfile +12 -17
  6. data/LICENSE +5 -2
  7. data/MAINTENANCE.md +42 -0
  8. data/README.de.md +711 -466
  9. data/README.es.md +206 -171
  10. data/README.fr.md +370 -344
  11. data/README.hu.md +44 -10
  12. data/README.ja.md +300 -210
  13. data/README.ko.md +230 -191
  14. data/README.md +675 -528
  15. data/README.pt-br.md +149 -115
  16. data/README.pt-pt.md +65 -65
  17. data/README.ru.md +198 -97
  18. data/README.zh.md +1943 -1237
  19. data/Rakefile +72 -49
  20. data/SECURITY.md +35 -0
  21. data/lib/sinatra/base.rb +141 -207
  22. data/lib/sinatra/indifferent_hash.rb +150 -0
  23. data/lib/sinatra/main.rb +1 -0
  24. data/lib/sinatra/show_exceptions.rb +70 -56
  25. data/lib/sinatra/version.rb +1 -1
  26. data/sinatra.gemspec +19 -7
  27. metadata +32 -163
  28. data/test/asciidoctor_test.rb +0 -72
  29. data/test/base_test.rb +0 -167
  30. data/test/builder_test.rb +0 -91
  31. data/test/coffee_test.rb +0 -96
  32. data/test/compile_test.rb +0 -183
  33. data/test/contest.rb +0 -91
  34. data/test/creole_test.rb +0 -65
  35. data/test/delegator_test.rb +0 -160
  36. data/test/encoding_test.rb +0 -20
  37. data/test/erb_test.rb +0 -116
  38. data/test/extensions_test.rb +0 -98
  39. data/test/filter_test.rb +0 -487
  40. data/test/haml_test.rb +0 -109
  41. data/test/helper.rb +0 -132
  42. data/test/helpers_test.rb +0 -1917
  43. data/test/integration/app.rb +0 -79
  44. data/test/integration_helper.rb +0 -236
  45. data/test/integration_test.rb +0 -104
  46. data/test/less_test.rb +0 -69
  47. data/test/liquid_test.rb +0 -77
  48. data/test/mapped_error_test.rb +0 -285
  49. data/test/markaby_test.rb +0 -80
  50. data/test/markdown_test.rb +0 -85
  51. data/test/mediawiki_test.rb +0 -68
  52. data/test/middleware_test.rb +0 -68
  53. data/test/nokogiri_test.rb +0 -67
  54. data/test/public/favicon.ico +0 -0
  55. data/test/rabl_test.rb +0 -89
  56. data/test/rack_test.rb +0 -45
  57. data/test/radius_test.rb +0 -59
  58. data/test/rdoc_test.rb +0 -66
  59. data/test/readme_test.rb +0 -130
  60. data/test/request_test.rb +0 -100
  61. data/test/response_test.rb +0 -63
  62. data/test/result_test.rb +0 -76
  63. data/test/route_added_hook_test.rb +0 -59
  64. data/test/routing_test.rb +0 -1412
  65. data/test/sass_test.rb +0 -115
  66. data/test/scss_test.rb +0 -88
  67. data/test/server_test.rb +0 -56
  68. data/test/settings_test.rb +0 -582
  69. data/test/sinatra_test.rb +0 -12
  70. data/test/slim_test.rb +0 -102
  71. data/test/static_test.rb +0 -236
  72. data/test/streaming_test.rb +0 -149
  73. data/test/stylus_test.rb +0 -90
  74. data/test/templates_test.rb +0 -382
  75. data/test/textile_test.rb +0 -65
  76. data/test/views/a/in_a.str +0 -1
  77. data/test/views/ascii.erb +0 -2
  78. data/test/views/b/in_b.str +0 -1
  79. data/test/views/calc.html.erb +0 -1
  80. data/test/views/error.builder +0 -3
  81. data/test/views/error.erb +0 -3
  82. data/test/views/error.haml +0 -3
  83. data/test/views/error.sass +0 -2
  84. data/test/views/explicitly_nested.str +0 -1
  85. data/test/views/foo/hello.test +0 -1
  86. data/test/views/hello.asciidoc +0 -1
  87. data/test/views/hello.builder +0 -1
  88. data/test/views/hello.coffee +0 -1
  89. data/test/views/hello.creole +0 -1
  90. data/test/views/hello.erb +0 -1
  91. data/test/views/hello.haml +0 -1
  92. data/test/views/hello.less +0 -5
  93. data/test/views/hello.liquid +0 -1
  94. data/test/views/hello.mab +0 -1
  95. data/test/views/hello.md +0 -1
  96. data/test/views/hello.mediawiki +0 -1
  97. data/test/views/hello.nokogiri +0 -1
  98. data/test/views/hello.rabl +0 -2
  99. data/test/views/hello.radius +0 -1
  100. data/test/views/hello.rdoc +0 -1
  101. data/test/views/hello.sass +0 -2
  102. data/test/views/hello.scss +0 -3
  103. data/test/views/hello.slim +0 -1
  104. data/test/views/hello.str +0 -1
  105. data/test/views/hello.styl +0 -2
  106. data/test/views/hello.test +0 -1
  107. data/test/views/hello.textile +0 -1
  108. data/test/views/hello.wlang +0 -1
  109. data/test/views/hello.yajl +0 -1
  110. data/test/views/layout2.builder +0 -3
  111. data/test/views/layout2.erb +0 -2
  112. data/test/views/layout2.haml +0 -2
  113. data/test/views/layout2.liquid +0 -2
  114. data/test/views/layout2.mab +0 -2
  115. data/test/views/layout2.nokogiri +0 -3
  116. data/test/views/layout2.rabl +0 -3
  117. data/test/views/layout2.radius +0 -2
  118. data/test/views/layout2.slim +0 -3
  119. data/test/views/layout2.str +0 -2
  120. data/test/views/layout2.test +0 -1
  121. data/test/views/layout2.wlang +0 -2
  122. data/test/views/nested.str +0 -1
  123. data/test/views/utf8.erb +0 -2
  124. data/test/wlang_test.rb +0 -87
  125. data/test/yajl_test.rb +0 -86
data/README.ja.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # Sinatra
2
2
 
3
3
  *注)
4
- 本文書は英語から翻訳したものであり、その内容が最新でない場合もあります。最新の情報はオリジナルの英語版を参照して下さい。*
4
+ 本文書は英語から翻訳したものであり、その内容が最新でない場合もあります。最新の情報はオリジナルの英語版を参照してください。*
5
5
 
6
- Sinatraは最小の労力でRubyによるWebアプリケーションを手早く作るための[DSL](http://ja.wikipedia.org/wiki/ドメイン固有言語)です。
6
+ Sinatraは最小の労力でRubyによるWebアプリケーションを手早く作るための[DSL](https://ja.wikipedia.org/wiki/メインページドメイン固有言語)です。
7
7
 
8
- ``` ruby
8
+ ```ruby
9
9
  # myapp.rb
10
10
  require 'sinatra'
11
11
 
@@ -16,17 +16,17 @@ end
16
16
 
17
17
  gemをインストールし、
18
18
 
19
- ``` shell
19
+ ```shell
20
20
  gem install sinatra
21
21
  ```
22
22
 
23
23
  次のように実行します。
24
24
 
25
- ``` shell
25
+ ```shell
26
26
  ruby myapp.rb
27
27
  ```
28
28
 
29
- [localhost:4567](http://localhost:4567) を開きます。
29
+ [http://localhost:4567](http://localhost:4567) を開きます。
30
30
 
31
31
  ThinがあればSinatraはこれを利用するので、`gem install thin`することをお薦めします。
32
32
 
@@ -70,9 +70,11 @@ ThinがあればSinatraはこれを利用するので、`gem install thin`する
70
70
  * [名前付きテンプレート(Named Templates)](#名前付きテンプレートnamed-templates)
71
71
  * [ファイル拡張子の関連付け](#ファイル拡張子の関連付け)
72
72
  * [オリジナルテンプレートエンジンの追加](#オリジナルテンプレートエンジンの追加)
73
+ * [カスタムロジックを使用したテンプレートの探索](#カスタムロジックを使用したテンプレートの探索)
73
74
  * [フィルタ(Filters)](#フィルタfilters)
74
75
  * [ヘルパー(Helpers)](#ヘルパーhelpers)
75
76
  * [セッションの使用](#セッションの使用)
77
+ * [セッションミドルウェアの選択](#セッションミドルウェアの選択)
76
78
  * [停止(Halting)](#停止halting)
77
79
  * [パッシング(Passing)](#パッシングpassing)
78
80
  * [別ルーティングの誘発](#別ルーティングの誘発)
@@ -109,6 +111,7 @@ ThinがあればSinatraはこれを利用するので、`gem install thin`する
109
111
  * [リクエスト/インスタンスのスコープ](#リクエストインスタンスのスコープ)
110
112
  * [デリゲートスコープ](#デリゲートスコープ)
111
113
  * [コマンドライン](#コマンドライン)
114
+ * [マルチスレッド](#マルチスレッド)
112
115
  * [必要環境](#必要環境)
113
116
  * [最新開発版](#最新開発版)
114
117
  * [Bundlerを使う場合](#bundlerを使う場合)
@@ -122,7 +125,7 @@ ThinがあればSinatraはこれを利用するので、`gem install thin`する
122
125
  Sinatraでは、ルーティングはHTTPメソッドとURLマッチングパターンがペアになっています。
123
126
  ルーティングはブロックに結び付けられています。
124
127
 
125
- ``` ruby
128
+ ```ruby
126
129
  get '/' do
127
130
  .. 何か見せる ..
128
131
  end
@@ -159,10 +162,18 @@ end
159
162
  ルーティングは定義された順番にマッチします。
160
163
  リクエストに最初にマッチしたルーティングが呼び出されます。
161
164
 
165
+ トレイリングスラッシュを付けたルートは、そうでないルートと異なったものになります。
166
+
167
+ ```ruby
168
+ get '/foo' do
169
+ # Does not match "GET /foo/"
170
+ end
171
+ ```
172
+
162
173
  ルーティングのパターンは名前付きパラメータを含むことができ、
163
174
  `params`ハッシュで取得できます。
164
175
 
165
- ``` ruby
176
+ ```ruby
166
177
  get '/hello/:name' do
167
178
  # "GET /hello/foo" と "GET /hello/bar" にマッチ
168
179
  # params['name'] は 'foo' か 'bar'
@@ -172,7 +183,7 @@ end
172
183
 
173
184
  また、ブロックパラメータで名前付きパラメータにアクセスすることもできます。
174
185
 
175
- ``` ruby
186
+ ```ruby
176
187
  get '/hello/:name' do |n|
177
188
  # "GET /hello/foo" と "GET /hello/bar" にマッチ
178
189
  # params['name'] は 'foo' か 'bar'
@@ -184,7 +195,7 @@ end
184
195
  ルーティングパターンはアスタリスク(すなわちワイルドカード)を含むこともでき、
185
196
  `params['splat']` で取得できます。
186
197
 
187
- ``` ruby
198
+ ```ruby
188
199
  get '/say/*/to/*' do
189
200
  # /say/hello/to/world にマッチ
190
201
  params['splat'] # => ["hello", "world"]
@@ -198,7 +209,7 @@ end
198
209
 
199
210
  ここで、ブロックパラメータを使うこともできます。
200
211
 
201
- ``` ruby
212
+ ```ruby
202
213
  get '/download/*.*' do |path, ext|
203
214
  [path, ext] # => ["path/to/file", "xml"]
204
215
  end
@@ -206,15 +217,15 @@ end
206
217
 
207
218
  ルーティングを正規表現にマッチさせることもできます。
208
219
 
209
- ``` ruby
210
- get /\A\/hello\/([\w]+)\z/ do
220
+ ```ruby
221
+ get /\/hello\/([\w]+)/ do
211
222
  "Hello, #{params['captures'].first}!"
212
223
  end
213
224
  ```
214
225
 
215
226
  ここでも、ブロックパラメータが使えます。
216
227
 
217
- ``` ruby
228
+ ```ruby
218
229
  get %r{/hello/([\w]+)} do |c|
219
230
  "Hello, #{c}!"
220
231
  end
@@ -222,9 +233,9 @@ end
222
233
 
223
234
  ルーティングパターンは、オプショナルパラメータを取ることもできます。
224
235
 
225
- ``` ruby
226
- get '/posts.?:format?' do
227
- # "GET /posts" と "GET /posts.json", "GET /posts.xml" の拡張子などにマッチ
236
+ ```ruby
237
+ get '/posts/:format?' do
238
+ # "GET /posts/" と "GET /posts/json", "GET /posts/xml" の拡張子などにマッチ
228
239
  end
229
240
  ```
230
241
 
@@ -235,7 +246,7 @@ end
235
246
 
236
247
  ルーティングにはユーザエージェントのようなさまざまな条件を含めることができます。
237
248
 
238
- ``` ruby
249
+ ```ruby
239
250
  get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
240
251
  "Songbirdのバージョン #{params['agent'][0]}を使ってます。"
241
252
  end
@@ -247,7 +258,7 @@ end
247
258
 
248
259
  ほかに`host_name`と`provides`条件が利用可能です。
249
260
 
250
- ``` ruby
261
+ ```ruby
251
262
  get '/', :host_name => /^admin\./ do
252
263
  "Adminエリアです。アクセスを拒否します!"
253
264
  end
@@ -263,7 +274,7 @@ end
263
274
 
264
275
  独自の条件を定義することも簡単にできます。
265
276
 
266
- ``` ruby
277
+ ```ruby
267
278
  set(:probability) { |value| condition { rand <= value } }
268
279
 
269
280
  get '/win_a_car', :probability => 0.1 do
@@ -277,7 +288,7 @@ end
277
288
 
278
289
  複数の値を取る条件には、アスタリスクを使います。
279
290
 
280
- ``` ruby
291
+ ```ruby
281
292
  set(:auth) do |*roles| # <- ここでアスタリスクを使う
282
293
  condition do
283
294
  unless logged_in? && roles.any? {|role| current_user.in_role? role }
@@ -313,7 +324,7 @@ Rackレスポンス、Rackボディオブジェクト、HTTPステータスコ
313
324
 
314
325
  これにより、例えばストリーミングを簡単に実装することができます。
315
326
 
316
- ``` ruby
327
+ ```ruby
317
328
  class Stream
318
329
  def each
319
330
  100.times { |i| yield "#{i}\n" }
@@ -329,7 +340,7 @@ get('/') { Stream.new }
329
340
 
330
341
  先述のようにSinatraはルーティングマッチャーとして、文字列パターンと正規表現を使うことをビルトインでサポートしています。しかしこれに留まらず、独自のマッチャーを簡単に定義することもできるのです。
331
342
 
332
- ``` ruby
343
+ ```ruby
333
344
  class AllButPattern
334
345
  Match = Struct.new(:captures)
335
346
 
@@ -354,7 +365,7 @@ end
354
365
 
355
366
  ノート: この例はオーバースペックであり、以下のようにも書くことができます。
356
367
 
357
- ``` ruby
368
+ ```ruby
358
369
  get // do
359
370
  pass if request.path_info == "/index"
360
371
  # ...
@@ -363,19 +374,18 @@ end
363
374
 
364
375
  または、否定先読みを使って:
365
376
 
366
- ``` ruby
367
- get %r{^(?!/index$)} do
377
+ ```ruby
378
+ get %r{(?!/index)} do
368
379
  # ...
369
380
  end
370
381
  ```
371
382
 
372
-
373
383
  ## 静的ファイル(Static Files)
374
384
 
375
385
  静的ファイルは`./public`ディレクトリから配信されます。
376
386
  `:public_folder`オプションを指定することで別の場所を指定することができます。
377
387
 
378
- ``` ruby
388
+ ```ruby
379
389
  set :public_folder, File.dirname(__FILE__) + '/static'
380
390
  ```
381
391
 
@@ -388,7 +398,7 @@ set :public_folder, File.dirname(__FILE__) + '/static'
388
398
 
389
399
  各テンプレート言語はそれ自身のレンダリングメソッドを通して展開されます。それらのメソッドは単に文字列を返します。
390
400
 
391
- ``` ruby
401
+ ```ruby
392
402
  get '/' do
393
403
  erb :index
394
404
  end
@@ -398,7 +408,7 @@ end
398
408
 
399
409
  テンプレート名を渡す代わりに、直接そのテンプレートの中身を渡すこともできます。
400
410
 
401
- ``` ruby
411
+ ```ruby
402
412
  get '/' do
403
413
  code = "<%= Time.now %>"
404
414
  erb code
@@ -407,7 +417,7 @@ end
407
417
 
408
418
  テンプレートのレイアウトは第2引数のハッシュ形式のオプションをもとに表示されます。
409
419
 
410
- ``` ruby
420
+ ```ruby
411
421
  get '/' do
412
422
  erb :index, :layout => :post
413
423
  end
@@ -417,8 +427,7 @@ end
417
427
 
418
428
  Sinatraが理解できないオプションは、テンプレートエンジンに渡されることになります。
419
429
 
420
-
421
- ``` ruby
430
+ ```ruby
422
431
  get '/' do
423
432
  haml :index, :format => :html5
424
433
  end
@@ -426,7 +435,7 @@ end
426
435
 
427
436
  テンプレート言語ごとにオプションをセットすることもできます。
428
437
 
429
- ``` ruby
438
+ ```ruby
430
439
  set :haml, :format => :html5
431
440
 
432
441
  get '/' do
@@ -447,7 +456,7 @@ end
447
456
 
448
457
  <dt>default_encoding</dt>
449
458
  <dd>
450
- 文字エンコーディング(不確かな場合に使用される)。デフォルトは、<tt>settings.default_encoding</tt>。
459
+ 文字エンコーディングが確実でない場合に指定。デフォルトは、<tt>settings.default_encoding</tt>。
451
460
  </dd>
452
461
 
453
462
  <dt>views</dt>
@@ -485,30 +494,36 @@ end
485
494
  テンプレートは`./views`ディレクトリ下に配置されています。
486
495
  他のディレクトリを使用する場合の例:
487
496
 
488
- ``` ruby
497
+ ```ruby
489
498
  set :views, settings.root + '/templates'
490
499
  ```
491
500
 
492
- テンプレートはシンボルを使用して参照させることを覚えておいて下さい。
493
- サブディレクトリでもこの場合は`:'subdir/template'`のようにします。
494
- レンダリングメソッドは文字列が渡されると、それをそのまま文字列として出力するので、シンボルを使ってください。
501
+ テンプレートの参照は、テンプレートがサブディレクトリ内にある場合でも常にシンボルで指定することを覚えておいてください。
502
+ (これは`:'subdir/template'`または`'subdir/template'.to_sym`のように指定することを意味します。)
503
+ レンダリングメソッドにシンボルではなく文字列を渡してしまうと、そのまま文字列として出力してしまいます。
495
504
 
496
505
  ### リテラルテンプレート(Literal Templates)
497
506
 
498
- ``` ruby
507
+ ```ruby
499
508
  get '/' do
500
509
  haml '%div.title Hello World'
501
510
  end
502
511
  ```
503
512
 
504
- これはそのテンプレート文字列をレンダリングします。
513
+ これはテンプレート文字列をレンダリングしています。
514
+ テンプレート文字列に関連するファイルパスや行数を`:path`や`:line`オプションで指定することで、バックトレースを明確にすることができます。
515
+
516
+ ```ruby
517
+ get '/' do
518
+ haml '%div.title Hello World', :path => 'examples/file.haml', :line => 3
519
+ end
520
+ ```
505
521
 
506
522
  ### 利用可能なテンプレート言語
507
523
 
508
524
  いくつかの言語には複数の実装があります。使用する(そしてスレッドセーフにする)実装を指定するには、それを最初にrequireしてください。
509
525
 
510
-
511
- ``` ruby
526
+ ```ruby
512
527
  require 'rdiscount' # または require 'bluecloth'
513
528
  get('/') { markdown :index }
514
529
  ```
@@ -530,7 +545,6 @@ get('/') { markdown :index }
530
545
  </tr>
531
546
  </table>
532
547
 
533
-
534
548
  #### Erb テンプレート
535
549
 
536
550
  <table>
@@ -577,7 +591,7 @@ get('/') { markdown :index }
577
591
  <table>
578
592
  <tr>
579
593
  <td>依存</td>
580
- <td><a href="http://nokogiri.org/" title="nokogiri">nokogiri</a></td>
594
+ <td><a href="http://www.nokogiri.org/" title="nokogiri">nokogiri</a></td>
581
595
  </tr>
582
596
  <tr>
583
597
  <td>ファイル拡張子</td>
@@ -591,7 +605,6 @@ get('/') { markdown :index }
591
605
 
592
606
  インラインテンプレート用にブロックを取ることもできます(例を参照)。
593
607
 
594
-
595
608
  #### Sass テンプレート
596
609
 
597
610
  <table>
@@ -609,7 +622,6 @@ get('/') { markdown :index }
609
622
  </tr>
610
623
  </table>
611
624
 
612
-
613
625
  #### Scss テンプレート
614
626
 
615
627
  <table>
@@ -632,7 +644,7 @@ get('/') { markdown :index }
632
644
  <table>
633
645
  <tr>
634
646
  <td>依存</td>
635
- <td><a href="http://www.lesscss.org/" title="less">less</a></td>
647
+ <td><a href="http://lesscss.org/" title="less">less</a></td>
636
648
  </tr>
637
649
  <tr>
638
650
  <td>ファイル拡張子</td>
@@ -649,7 +661,7 @@ get('/') { markdown :index }
649
661
  <table>
650
662
  <tr>
651
663
  <td>依存</td>
652
- <td><a href="http://www.liquidmarkup.org/" title="liquid">liquid</a></td>
664
+ <td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
653
665
  </tr>
654
666
  <tr>
655
667
  <td>ファイル拡張子</td>
@@ -670,7 +682,7 @@ LiquidテンプレートからRubyのメソッド(`yield`を除く)を呼び出
670
682
  <td>依存</td>
671
683
  <td>
672
684
  次の何れか:
673
- <a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
685
+ <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
674
686
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
675
687
  <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
676
688
  <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
@@ -690,20 +702,19 @@ LiquidテンプレートからRubyのメソッド(`yield`を除く)を呼び出
690
702
  Markdownからメソッドを呼び出すことも、localsに変数を渡すこともできません。
691
703
  それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です。
692
704
 
693
- ``` ruby
705
+ ```ruby
694
706
  erb :overview, :locals => { :text => markdown(:introduction) }
695
707
  ```
696
708
 
697
709
  ノート: 他のテンプレート内で`markdown`メソッドを呼び出せます。
698
710
 
699
- ``` ruby
711
+ ```ruby
700
712
  %h1 Hello From Haml!
701
713
  %p= markdown(:greetings)
702
714
  ```
703
715
 
704
716
  MarkdownからはRubyを呼ぶことができないので、Markdownで書かれたレイアウトを使うことはできません。しかしながら、`:layout_engine`オプションを渡すことでテンプレートのものとは異なるレンダリングエンジンをレイアウトのために使うことができます。
705
717
 
706
-
707
718
  #### Textile テンプレート
708
719
 
709
720
  <table>
@@ -724,13 +735,13 @@ MarkdownからはRubyを呼ぶことができないので、Markdownで書かれ
724
735
  Textileからメソッドを呼び出すことも、localsに変数を渡すこともできません。
725
736
  それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です。
726
737
 
727
- ``` ruby
738
+ ```ruby
728
739
  erb :overview, :locals => { :text => textile(:introduction) }
729
740
  ```
730
741
 
731
742
  ノート: 他のテンプレート内で`textile`メソッドを呼び出せます。
732
743
 
733
- ``` ruby
744
+ ```ruby
734
745
  %h1 Hello From Haml!
735
746
  %p= textile(:greetings)
736
747
  ```
@@ -757,14 +768,13 @@ TexttileからはRubyを呼ぶことができないので、Textileで書かれ
757
768
  RDocからメソッドを呼び出すことも、localsに変数を渡すこともできません。
758
769
  それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です。
759
770
 
760
- ``` ruby
771
+ ```ruby
761
772
  erb :overview, :locals => { :text => rdoc(:introduction) }
762
773
  ```
763
774
 
764
775
  ノート: 他のテンプレート内で`rdoc`メソッドを呼び出せます。
765
776
 
766
-
767
- ``` ruby
777
+ ```ruby
768
778
  %h1 Hello From Haml!
769
779
  %p= rdoc(:greetings)
770
780
  ```
@@ -809,13 +819,12 @@ AsciiDocテンプレートからRubyのメソッドを直接呼び出すこと
809
819
 
810
820
  RadiusテンプレートからRubyのメソッドを直接呼び出すことができないため、ほぼ全ての場合にlocalsを指定する必要があるでしょう。
811
821
 
812
-
813
822
  #### Markaby テンプレート
814
823
 
815
824
  <table>
816
825
  <tr>
817
826
  <td>依存</td>
818
- <td><a href="http://markaby.github.com/" title="Markaby">Markaby</a></td>
827
+ <td><a href="http://markaby.github.io/" title="Markaby">Markaby</a></td>
819
828
  </tr>
820
829
  <tr>
821
830
  <td>ファイル拡張子</td>
@@ -883,13 +892,13 @@ RadiusテンプレートからRubyのメソッドを直接呼び出すことが
883
892
  Creoleからメソッドを呼び出すことも、localsに変数を渡すこともできません。
884
893
  それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です。
885
894
 
886
- ``` ruby
895
+ ```ruby
887
896
  erb :overview, :locals => { :text => creole(:introduction) }
888
897
  ```
889
898
 
890
899
  ノート: 他のテンプレート内で`creole`メソッドを呼び出せます。
891
900
 
892
- ``` ruby
901
+ ```ruby
893
902
  %h1 Hello From Haml!
894
903
  %p= creole(:greetings)
895
904
  ```
@@ -951,7 +960,7 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
951
960
  <tr>
952
961
  <td>依存</td>
953
962
  <td>
954
- <a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
963
+ <a href="https://github.com/forgecrafted/ruby-stylus" title="Ruby Stylus">
955
964
  Stylus
956
965
  </a> および
957
966
  <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
@@ -971,7 +980,7 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
971
980
 
972
981
  Stylusテンプレートを使えるようにする前に、まず`stylus`と`stylus/tilt`を読み込む必要があります。
973
982
 
974
- ``` ruby
983
+ ```ruby
975
984
  require 'sinatra'
976
985
  require 'stylus'
977
986
  require 'stylus/tilt'
@@ -1005,17 +1014,16 @@ end
1005
1014
  </tr>
1006
1015
  </table>
1007
1016
 
1008
-
1009
1017
  テンプレートのソースはRubyの文字列として評価され、その結果のJSON変数は`#to_json`を使って変換されます。
1010
1018
 
1011
- ``` ruby
1019
+ ```ruby
1012
1020
  json = { :foo => 'bar' }
1013
1021
  json[:baz] = key
1014
1022
  ```
1015
1023
 
1016
1024
  `:callback`および`:variable`オプションは、レンダリングされたオブジェクトを装飾するために使うことができます。
1017
1025
 
1018
- ``` ruby
1026
+ ```ruby
1019
1027
  var resource = {"foo":"bar","baz":"qux"}; present(resource);
1020
1028
  ```
1021
1029
 
@@ -1042,7 +1050,7 @@ WLang内でのRubyメソッドの呼び出しは一般的ではないので、
1042
1050
 
1043
1051
  テンプレートはルーティングハンドラと同じコンテキストの中で評価されます。ルーティングハンドラでセットされたインスタンス変数はテンプレート内で直接使うことができます。
1044
1052
 
1045
- ``` ruby
1053
+ ```ruby
1046
1054
  get '/:id' do
1047
1055
  @foo = Foo.find(params['id'])
1048
1056
  haml '%h1= @foo.name'
@@ -1051,21 +1059,21 @@ end
1051
1059
 
1052
1060
  また、ローカル変数のハッシュで明示的に指定することもできます。
1053
1061
 
1054
- ``` ruby
1062
+ ```ruby
1055
1063
  get '/:id' do
1056
1064
  foo = Foo.find(params['id'])
1057
1065
  haml '%h1= bar.name', :locals => { :bar => foo }
1058
1066
  end
1059
1067
  ```
1060
1068
 
1061
- このやり方は他のテンプレート内で部分テンプレートとして表示する時に典型的に使用されます。
1069
+ これは他のテンプレート内で部分テンプレートとして表示する典型的な手法です。
1062
1070
 
1063
1071
  ### `yield`を伴うテンプレートとネストしたレイアウト
1064
1072
 
1065
1073
  レイアウトは通常、`yield`を呼ぶ単なるテンプレートに過ぎません。
1066
1074
  そのようなテンプレートは、既に説明した`:template`オプションを通して使われるか、または次のようなブロックを伴ってレンダリングされます。
1067
1075
 
1068
- ``` ruby
1076
+ ```ruby
1069
1077
  erb :post, :layout => false do
1070
1078
  erb :index
1071
1079
  end
@@ -1075,7 +1083,7 @@ end
1075
1083
 
1076
1084
  レンダリングメソッドにブロックを渡すスタイルは、ネストしたレイアウトを作るために最も役立ちます。
1077
1085
 
1078
- ``` ruby
1086
+ ```ruby
1079
1087
  erb :main_layout, :layout => false do
1080
1088
  erb :admin_layout do
1081
1089
  erb :user
@@ -1085,7 +1093,7 @@ end
1085
1093
 
1086
1094
  これはまた次のより短いコードでも達成できます。
1087
1095
 
1088
- ``` ruby
1096
+ ```ruby
1089
1097
  erb :admin_layout, :layout => :main_layout do
1090
1098
  erb :user
1091
1099
  end
@@ -1095,12 +1103,11 @@ end
1095
1103
  `liquid`, `slim `, `wlang`。
1096
1104
  また汎用の`render`メソッドもブロックを取れます。
1097
1105
 
1098
-
1099
1106
  ### インラインテンプレート(Inline Templates)
1100
1107
 
1101
1108
  テンプレートはソースファイルの最後で定義することもできます。
1102
1109
 
1103
- ``` ruby
1110
+ ```ruby
1104
1111
  require 'sinatra'
1105
1112
 
1106
1113
  get '/' do
@@ -1123,7 +1130,7 @@ __END__
1123
1130
 
1124
1131
  テンプレートはトップレベルの`template`メソッドで定義することもできます。
1125
1132
 
1126
- ``` ruby
1133
+ ```ruby
1127
1134
  template :layout do
1128
1135
  "%html\n =yield\n"
1129
1136
  end
@@ -1137,9 +1144,9 @@ get '/' do
1137
1144
  end
1138
1145
  ```
1139
1146
 
1140
- 「layout」というテンプレートが存在する場合、そのテンプレートファイルは他のテンプレートがレンダリングされる度に使用されます。`:layout => false`で個別に、または`set :haml, :layout => false`でデフォルトとして、レイアウトを無効にすることができます。
1147
+ 「layout」という名前のテンプレートが存在する場合は、そのテンプレートファイルは他のテンプレートがレンダリングされる度に使用されます。`:layout => false`で個別に、または`set :haml, :layout => false`でデフォルトとして、レイアウトを無効にすることができます。
1141
1148
 
1142
- ``` ruby
1149
+ ```ruby
1143
1150
  get '/' do
1144
1151
  haml :index, :layout => !request.xhr?
1145
1152
  end
@@ -1149,7 +1156,7 @@ end
1149
1156
 
1150
1157
  任意のテンプレートエンジンにファイル拡張子を関連付ける場合は、`Tilt.register`を使います。例えば、Textileテンプレートに`tt`というファイル拡張子を使いたい場合は、以下のようにします。
1151
1158
 
1152
- ``` ruby
1159
+ ```ruby
1153
1160
  Tilt.register :tt, Tilt[:textile]
1154
1161
  ```
1155
1162
 
@@ -1157,7 +1164,7 @@ Tilt.register :tt, Tilt[:textile]
1157
1164
 
1158
1165
  まず、Tiltでそのエンジンを登録し、次にレンダリングメソッドを作ります。
1159
1166
 
1160
- ``` ruby
1167
+ ```ruby
1161
1168
  Tilt.register :myat, MyAwesomeTemplateEngine
1162
1169
 
1163
1170
  helpers do
@@ -1171,11 +1178,27 @@ end
1171
1178
 
1172
1179
  これは、`./views/index.myat`をレンダリングします。Tiltについての詳細は、https://github.com/rtomayko/tilt を参照してください。
1173
1180
 
1181
+ ### カスタムロジックを使用したテンプレートの探索
1182
+
1183
+ オリジナルテンプレートの検索メカニズムを実装するためには、`#find_template`メソッドを実装します。
1184
+
1185
+ ```ruby
1186
+ configure do
1187
+ set :views [ './views/a', './views/b' ]
1188
+ end
1189
+
1190
+ def find_template(views, name, engine, &block)
1191
+ Array(views).each do |v|
1192
+ super(v, name, engine, &block)
1193
+ end
1194
+ end
1195
+ ```
1196
+
1174
1197
  ## フィルタ(Filters)
1175
1198
 
1176
1199
  beforeフィルタは、リクエストのルーティングと同じコンテキストで各リクエストの前に評価され、それによってリクエストとレスポンスを変更可能にします。フィルタ内でセットされたインスタンス変数はルーティングとテンプレートからアクセスすることができます。
1177
1200
 
1178
- ``` ruby
1201
+ ```ruby
1179
1202
  before do
1180
1203
  @note = 'Hi!'
1181
1204
  request.path_info = '/foo/bar/baz'
@@ -1189,7 +1212,7 @@ end
1189
1212
 
1190
1213
  afterフィルタは、リクエストのルーティングと同じコンテキストで各リクエストの後に評価され、それによってこれもリクエストとレスポンスを変更可能にします。beforeフィルタとルーティング内でセットされたインスタンス変数はafterフィルタからアクセスすることができます。
1191
1214
 
1192
- ``` ruby
1215
+ ```ruby
1193
1216
  after do
1194
1217
  puts response.status
1195
1218
  end
@@ -1199,7 +1222,7 @@ end
1199
1222
 
1200
1223
  フィルタにはオプションとしてパターンを渡すことができ、この場合はリクエストのパスがパターンにマッチした場合にのみフィルタが評価されるようになります。
1201
1224
 
1202
- ``` ruby
1225
+ ```ruby
1203
1226
  before '/protected/*' do
1204
1227
  authenticate!
1205
1228
  end
@@ -1211,7 +1234,7 @@ end
1211
1234
 
1212
1235
  ルーティング同様、フィルタもまた条件を取ることができます。
1213
1236
 
1214
- ``` ruby
1237
+ ```ruby
1215
1238
  before :agent => /Songbird/ do
1216
1239
  # ...
1217
1240
  end
@@ -1225,7 +1248,7 @@ end
1225
1248
 
1226
1249
  トップレベルの`helpers`メソッドを使用してルーティングハンドラやテンプレートで使うヘルパーメソッドを定義できます。
1227
1250
 
1228
- ``` ruby
1251
+ ```ruby
1229
1252
  helpers do
1230
1253
  def bar(name)
1231
1254
  "#{name}bar"
@@ -1239,7 +1262,7 @@ end
1239
1262
 
1240
1263
  あるいは、ヘルパーメソッドをモジュール内で個別に定義することもできます。
1241
1264
 
1242
- ``` ruby
1265
+ ```ruby
1243
1266
  module FooUtils
1244
1267
  def foo(name) "#{name}foo" end
1245
1268
  end
@@ -1253,12 +1276,11 @@ helpers FooUtils, BarUtils
1253
1276
 
1254
1277
  その効果は、アプリケーションクラスにモジュールをインクルードするのと同じです。
1255
1278
 
1256
-
1257
1279
  ### セッションの使用
1258
1280
 
1259
- セッションはリクエスト間での状態維持のために使用されます。その起動により、ユーザセッションごとに一つのセッションハッシュが与えられます。
1281
+ セッションはリクエスト間での状態維持のために使用されます。セッションを有効化すると、ユーザセッションごとに一つのセッションハッシュが与えられます。
1260
1282
 
1261
- ``` ruby
1283
+ ```ruby
1262
1284
  enable :sessions
1263
1285
 
1264
1286
  get '/' do
@@ -1272,7 +1294,7 @@ end
1272
1294
 
1273
1295
  ノート: `enable :sessions`は実際にはすべてのデータをクッキーに保持します。これは必ずしも期待通りのものにならないかもしれません(例えば、大量のデータを保持することでトラフィックが増大するなど)。Rackセッションミドルウェアの利用が可能であり、その場合は`enable :sessions`を呼ばずに、選択したミドルウェアを他のミドルウェアのときと同じようにして取り込んでください。
1274
1296
 
1275
- ``` ruby
1297
+ ```ruby
1276
1298
  use Rack::Session::Pool, :expire_after => 2592000
1277
1299
 
1278
1300
  get '/' do
@@ -1286,57 +1308,89 @@ end
1286
1308
 
1287
1309
  セキュリティ向上のため、クッキー内のセッションデータはセッション秘密鍵(session secret)で署名されます。Sinatraによりランダムな秘密鍵が個別に生成されます。しかし、この秘密鍵はアプリケーションの立ち上げごとに変わってしまうので、すべてのアプリケーションのインスタンスで共有できる秘密鍵をセットしたくなるかもしれません。
1288
1310
 
1289
- ``` ruby
1311
+ ```ruby
1290
1312
  set :session_secret, 'super secret'
1291
1313
  ```
1292
1314
 
1293
1315
  更に、設定変更をしたい場合は、`sessions`の設定においてオプションハッシュを保持することもできます。
1294
1316
 
1295
- ``` ruby
1317
+ ```ruby
1296
1318
  set :sessions, :domain => 'foo.com'
1297
1319
  ```
1298
1320
 
1299
1321
  foo.comのサブドメイン上のアプリ間でセッションを共有化したいときは、代わりにドメインの前に *.* を付けます。
1300
1322
 
1301
- ``` ruby
1323
+ ```ruby
1302
1324
  set :sessions, :domain => '.foo.com'
1303
1325
  ```
1304
1326
 
1327
+ #### セッションミドルウェアの選択
1328
+
1329
+ `enable :sessions`とすることで、クッキー内の全てのデータを実際に保存してしまうことに注意してください。
1330
+ これは、あなたが望む挙動ではない(例えば、大量のデータを保存することでトラフィックが増大してしまう)かもしれません。
1331
+ あなたは、次のいずれかの方法によって、任意のRackセッションミドルウェアを使用することができます。
1332
+
1333
+ ```ruby
1334
+ enable :sessions
1335
+ set :session_store, Rack::Session::Pool
1336
+ ```
1337
+
1338
+ オプションのハッシュを設定するためには、次のようにします。
1339
+
1340
+ ```ruby
1341
+ set :sessions, :expire_after => 2592000
1342
+ set :session_store, Rack::Session::Pool
1343
+ ```
1344
+
1345
+ 他の方法は`enable :sessions`を**しない**で、他のミドルウェアの選択と同様にあなた自身でミドルウェアを選択することです。
1346
+
1347
+ この方法を選択する場合は、セッションベースの保護は**デフォルトで有効にならない**ということに注意することが重要です。
1348
+
1349
+ これを満たすためのRackミドルウェアを追加することが必要になります。
1350
+
1351
+ ```ruby
1352
+ use Rack::Session::Pool, :expire_after => 2592000
1353
+ use Rack::Protection::RemoteToken
1354
+ use Rack::Protection::SessionHijacking
1355
+ ```
1356
+
1357
+ より詳しい情報は、「攻撃防御に対する設定」の項を参照してください。
1358
+
1305
1359
  ### 停止(Halting)
1306
1360
 
1307
1361
  フィルタまたはルーティング内で直ちにリクエストを止める場合
1308
1362
 
1309
- ``` ruby
1363
+ ```ruby
1310
1364
  halt
1311
1365
  ```
1312
1366
 
1313
1367
  この際、ステータスを指定することもできます。
1314
1368
 
1315
- ``` ruby
1369
+ ```ruby
1316
1370
  halt 410
1317
1371
  ```
1318
1372
 
1319
1373
  body部を指定することも、
1320
1374
 
1321
- ``` ruby
1375
+ ```ruby
1322
1376
  halt 'ここにbodyを書く'
1323
1377
  ```
1324
1378
 
1325
1379
  ステータスとbody部を指定することも、
1326
1380
 
1327
- ``` ruby
1381
+ ```ruby
1328
1382
  halt 401, '立ち去れ!'
1329
1383
  ```
1330
1384
 
1331
1385
  ヘッダを付けることもできます。
1332
1386
 
1333
- ``` ruby
1387
+ ```ruby
1334
1388
  halt 402, {'Content-Type' => 'text/plain'}, 'リベンジ'
1335
1389
  ```
1336
1390
 
1337
1391
  もちろん、テンプレートを`halt`に結びつけることも可能です。
1338
1392
 
1339
- ``` ruby
1393
+ ```ruby
1340
1394
  halt erb(:error)
1341
1395
  ```
1342
1396
 
@@ -1344,7 +1398,7 @@ halt erb(:error)
1344
1398
 
1345
1399
  ルーティングは`pass`を使って次のルーティングに飛ばすことができます。
1346
1400
 
1347
- ``` ruby
1401
+ ```ruby
1348
1402
  get '/guess/:who' do
1349
1403
  pass unless params['who'] == 'Frank'
1350
1404
  "見つかっちゃった!"
@@ -1359,9 +1413,10 @@ end
1359
1413
 
1360
1414
  ### 別ルーティングの誘発
1361
1415
 
1362
- `pass`を使ってルーティングを飛ばすのではなく、他のルーティングを呼んだ結果を得たいというときがあります。これを実現するには`call`を使えばいいです。
1416
+ `pass`を使ってルーティングを飛ばすのではなく、他のルーティングを呼んだ結果を得たいという場合があります。
1417
+ これは`call`を使用することで実現できます。
1363
1418
 
1364
- ``` ruby
1419
+ ```ruby
1365
1420
  get '/foo' do
1366
1421
  status, headers, body = call env.merge("PATH_INFO" => '/bar')
1367
1422
  [status, headers, body.map(&:upcase)]
@@ -1372,18 +1427,17 @@ get '/bar' do
1372
1427
  end
1373
1428
  ```
1374
1429
 
1375
- ノート: 先の例において、テストを楽にしパフォーマンスを改善するには、`"bar"`を単にヘルパーに移し、`/foo`および`/bar`から使えるようにするのがいいです。
1430
+ ノート: 先の例において、テストを楽にしパフォーマンスを改善するには、`"bar"`を単にヘルパーに移し、`/foo`および`/bar`から使えるようにしたほうが良いです。
1376
1431
 
1377
1432
  リクエストが、その複製物でない同じアプリケーションのインスタンスに送られるようにしたいときは、`call`に代えて`call!`を使ってください。
1378
1433
 
1379
- `call`についての詳細はRackの仕様書を参照してください。
1380
-
1434
+ `call`についての詳細はRackの仕様を参照してください。
1381
1435
 
1382
1436
  ### ボディ、ステータスコードおよびヘッダの設定
1383
1437
 
1384
1438
  ステータスコードおよびレスポンスボディを、ルーティングブロックの戻り値にセットすることが可能であり、これは推奨されています。しかし、あるケースでは実行フローの任意のタイミングでボディをセットしたくなるかもしれません。`body`ヘルパーメソッドを使えばそれができます。そうすると、それ以降、ボディにアクセスするためにそのメソッドを使うことができるようになります。
1385
1439
 
1386
- ``` ruby
1440
+ ```ruby
1387
1441
  get '/foo' do
1388
1442
  body "bar"
1389
1443
  end
@@ -1397,7 +1451,7 @@ end
1397
1451
 
1398
1452
  ボディと同様に、ステータスコードおよびヘッダもセットできます。
1399
1453
 
1400
- ``` ruby
1454
+ ```ruby
1401
1455
  get '/foo' do
1402
1456
  status 418
1403
1457
  headers \
@@ -1413,7 +1467,7 @@ end
1413
1467
 
1414
1468
  レスポンスボディの部分を未だ生成している段階で、データを送り出したいということがあります。極端な例では、クライアントがコネクションを閉じるまでデータを送り続けたいことがあります。`stream`ヘルパーを使えば、独自ラッパーを作る必要はありません。
1415
1469
 
1416
- ``` ruby
1470
+ ```ruby
1417
1471
  get '/' do
1418
1472
  stream do |out|
1419
1473
  out << "それは伝 -\n"
@@ -1425,13 +1479,13 @@ get '/' do
1425
1479
  end
1426
1480
  ```
1427
1481
 
1428
- これはストリーミングAPI、[Server Sent Events](http://dev.w3.org/html5/eventsource/)の実装を可能にし、[WebSockets](http://en.wikipedia.org/wiki/WebSocket)の土台に使うことができます。また、一部のコンテンツが遅いリソースに依存しているときに、スループットを上げるために使うこともできます。
1482
+ これはストリーミングAPI、[Server Sent Events](https://w3c.github.io/eventsource/)の実装を可能にし、[WebSockets](https://en.wikipedia.org/wiki/WebSocket)の土台に使うことができます。また、一部のコンテンツが遅いリソースに依存しているときに、スループットを上げるために使うこともできます。
1429
1483
 
1430
- ノート: ストリーミングの挙動、特に並行リクエスト(cuncurrent requests)の数は、アプリケーションを提供するのに使われるWebサーバに強く依存します。WEBRickを含むいくつかのサーバは、ストリーミングを全くサポートしません。サーバがストリーミングをサポートしない場合、ボディは`stream`に渡されたブロックの実行が終了した後、一度に全部送られることになります。ストリーミングは、Shotgunを使った場合は全く動作しません。
1484
+ ノート: ストリーミングの挙動、特に並行リクエスト(cuncurrent requests)の数は、アプリケーションを提供するのに使われるWebサーバに強く依存します。いくつかのサーバは、ストリーミングを全くサポートしません。サーバがストリーミングをサポートしない場合、ボディは`stream`に渡されたブロックの実行が終了した後、一度に全部送られることになります。ストリーミングは、Shotgunを使った場合は全く動作しません。
1431
1485
 
1432
1486
  オプション引数が`keep_open`にセットされている場合、ストリームオブジェクト上で`close`は呼ばれず、実行フローの任意の遅れたタイミングでユーザがこれを閉じることを可能にします。これはThinやRainbowsのようなイベント型サーバ上でしか機能しません。他のサーバでは依然ストリームは閉じられます。
1433
1487
 
1434
- ``` ruby
1488
+ ```ruby
1435
1489
  # ロングポーリング
1436
1490
 
1437
1491
  set :server, :thin
@@ -1460,12 +1514,13 @@ post '/message' do
1460
1514
  end
1461
1515
  ```
1462
1516
 
1517
+ クライアントはソケットに書き込もうとしている接続を閉じることも可能です。そのため、記述しようとする前に`out.closed?`をチェックすることを勧めます。
1518
+
1463
1519
  ### ロギング(Logging)
1464
1520
 
1465
1521
  リクエストスコープにおいて、`logger`ヘルパーは`Logger`インスタンスを作り出します。
1466
1522
 
1467
-
1468
- ``` ruby
1523
+ ```ruby
1469
1524
  get '/' do
1470
1525
  logger.info "loading data"
1471
1526
  # ...
@@ -1476,7 +1531,7 @@ end
1476
1531
 
1477
1532
  ノート: ロギングは、`Sinatra::Application`に対してのみデフォルトで有効にされているので、`Sinatra::Base`を継承している場合は、ユーザがこれを有効化する必要があります。
1478
1533
 
1479
- ``` ruby
1534
+ ```ruby
1480
1535
  class MyApp < Sinatra::Base
1481
1536
  configure :production, :development do
1482
1537
  enable :logging
@@ -1488,9 +1543,9 @@ end
1488
1543
 
1489
1544
  ### MIMEタイプ(Mime Types)
1490
1545
 
1491
- `send_file`か静的ファイルを使う時、SinatraがMIMEタイプを理解できない場合があります。その時は `mime_type` を使ってファイル拡張子毎に登録して下さい。
1546
+ `send_file`か静的ファイルを使う時、SinatraがMIMEタイプを理解できない場合があります。その時は `mime_type` を使ってファイル拡張子毎に登録してください。
1492
1547
 
1493
- ``` ruby
1548
+ ```ruby
1494
1549
  configure do
1495
1550
  mime_type :foo, 'text/foo'
1496
1551
  end
@@ -1498,7 +1553,7 @@ end
1498
1553
 
1499
1554
  これは`content_type`ヘルパーで利用することができます:
1500
1555
 
1501
- ``` ruby
1556
+ ```ruby
1502
1557
  get '/' do
1503
1558
  content_type :foo
1504
1559
  "foo foo foo"
@@ -1509,7 +1564,7 @@ end
1509
1564
 
1510
1565
  URLを生成するためには`url`ヘルパーメソッドが使えます。Hamlではこのようにします。
1511
1566
 
1512
- ``` ruby
1567
+ ```ruby
1513
1568
  %a{:href => url('/foo')} foo
1514
1569
  ```
1515
1570
 
@@ -1521,7 +1576,7 @@ URLを生成するためには`url`ヘルパーメソッドが使えます。Ham
1521
1576
 
1522
1577
  `redirect` ヘルパーメソッドを使うことで、ブラウザをリダイレクトさせることができます。
1523
1578
 
1524
- ``` ruby
1579
+ ```ruby
1525
1580
  get '/foo' do
1526
1581
  redirect to('/bar')
1527
1582
  end
@@ -1529,14 +1584,14 @@ end
1529
1584
 
1530
1585
  他に追加されるパラメータは、`halt`に渡される引数と同様に取り扱われます。
1531
1586
 
1532
- ``` ruby
1587
+ ```ruby
1533
1588
  redirect to('/bar'), 303
1534
- redirect 'http://google.com', 'wrong place, buddy'
1589
+ redirect 'http://www.google.com/', 'wrong place, buddy'
1535
1590
  ```
1536
1591
 
1537
1592
  また、`redirect back`を使えば、簡単にユーザが来たページへ戻るリダイレクトを作れます。
1538
1593
 
1539
- ``` ruby
1594
+ ```ruby
1540
1595
  get '/foo' do
1541
1596
  "<a href='/bar'>do something</a>"
1542
1597
  end
@@ -1549,14 +1604,13 @@ end
1549
1604
 
1550
1605
  redirectに引数を渡すには、それをクエリーに追加するか、
1551
1606
 
1552
-
1553
- ``` ruby
1607
+ ```ruby
1554
1608
  redirect to('/bar?sum=42')
1555
1609
  ```
1556
1610
 
1557
1611
  または、セッションを使います。
1558
1612
 
1559
- ``` ruby
1613
+ ```ruby
1560
1614
  enable :sessions
1561
1615
 
1562
1616
  get '/foo' do
@@ -1575,7 +1629,7 @@ end
1575
1629
 
1576
1630
  キャッシュ制御ヘッダ(Cache-Control header)は、次のように簡単に設定できます。
1577
1631
 
1578
- ``` ruby
1632
+ ```ruby
1579
1633
  get '/' do
1580
1634
  cache_control :public
1581
1635
  "キャッシュしました!"
@@ -1584,7 +1638,7 @@ end
1584
1638
 
1585
1639
  ヒント: キャッシングをbeforeフィルタ内で設定します。
1586
1640
 
1587
- ``` ruby
1641
+ ```ruby
1588
1642
  before do
1589
1643
  cache_control :public, :must_revalidate, :max_age => 60
1590
1644
  end
@@ -1592,7 +1646,7 @@ end
1592
1646
 
1593
1647
  `expires`ヘルパーを対応するヘッダに使っている場合は、キャッシュ制御は自動で設定されます。
1594
1648
 
1595
- ``` ruby
1649
+ ```ruby
1596
1650
  before do
1597
1651
  expires 500, :public, :must_revalidate
1598
1652
  end
@@ -1600,7 +1654,7 @@ end
1600
1654
 
1601
1655
  キャッシュを適切に使うために、`etag`または`last_modified`を使うことを検討してください。これらのヘルパーを、重い仕事をさせる *前* に呼ぶことを推奨します。そうすれば、クライアントが既にキャッシュに最新版を持っている場合はレスポンスを直ちに破棄するようになります。
1602
1656
 
1603
- ``` ruby
1657
+ ```ruby
1604
1658
  get '/article/:id' do
1605
1659
  @article = Article.find params['id']
1606
1660
  last_modified @article.updated_at
@@ -1609,16 +1663,15 @@ get '/article/:id' do
1609
1663
  end
1610
1664
  ```
1611
1665
 
1612
- また、[weak ETag](http://ja.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation)を使うこともできます。
1666
+ また、[weak ETag](https://ja.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation)を使うこともできます。
1613
1667
 
1614
- ``` ruby
1668
+ ```ruby
1615
1669
  etag @article.sha1, :weak
1616
1670
  ```
1617
1671
 
1618
1672
  これらのヘルパーは、キャッシングをしてくれませんが、必要な情報をキャッシュに与えてくれます。もし手早いリバースプロキシキャッシングの解決策をお探しなら、 [rack-cache](https://github.com/rtomayko/rack-cache)を試してください。
1619
1673
 
1620
-
1621
- ``` ruby
1674
+ ```ruby
1622
1675
  require "rack/cache"
1623
1676
  require "sinatra"
1624
1677
 
@@ -1635,7 +1688,7 @@ end
1635
1688
 
1636
1689
  RFC 2616によれば、アプリケーションは、If-MatchまたはIf-None-Matchヘッダが`*`に設定されている場合には、要求されたリソースが既に存在するか否かに応じて、異なる振る舞いをすべきとなっています。Sinatraは、getのような安全なリクエストおよびputのような冪等なリクエストは既に存在しているものとして仮定し、一方で、他のリソース(例えば、postリクエスト)は新たなリソースとして取り扱われるよう仮定します。この振る舞いは、`:new_resource`オプションを渡すことで変更できます。
1637
1690
 
1638
- ``` ruby
1691
+ ```ruby
1639
1692
  get '/create' do
1640
1693
  etag '', :new_resource => true
1641
1694
  Article.create
@@ -1645,7 +1698,7 @@ end
1645
1698
 
1646
1699
  ここでもWeak ETagを使いたい場合は、`:kind`オプションを渡してください。
1647
1700
 
1648
- ``` ruby
1701
+ ```ruby
1649
1702
  etag '', :new_resource => true, :kind => :weak
1650
1703
  ```
1651
1704
 
@@ -1653,7 +1706,7 @@ etag '', :new_resource => true, :kind => :weak
1653
1706
 
1654
1707
  ファイルを送信するには、`send_file`ヘルパーメソッドを使います。
1655
1708
 
1656
- ``` ruby
1709
+ ```ruby
1657
1710
  get '/' do
1658
1711
  send_file 'foo.png'
1659
1712
  end
@@ -1661,7 +1714,7 @@ end
1661
1714
 
1662
1715
  これはオプションを取ることもできます。
1663
1716
 
1664
- ``` ruby
1717
+ ```ruby
1665
1718
  send_file 'foo.png', :type => :jpg
1666
1719
  ```
1667
1720
 
@@ -1694,12 +1747,11 @@ send_file 'foo.png', :type => :jpg
1694
1747
  </dd>
1695
1748
  </dl>
1696
1749
 
1697
-
1698
1750
  ### リクエストオブジェクトへのアクセス
1699
1751
 
1700
1752
  受信するリクエストオブジェクトは、`request`メソッドを通じてリクエストレベル(フィルタ、ルーティング、エラーハンドラ)からアクセスすることができます。
1701
1753
 
1702
- ``` ruby
1754
+ ```ruby
1703
1755
  # アプリケーションが http://example.com/example で動作している場合
1704
1756
  get '/foo' do
1705
1757
  t = %w[text/css text/html application/javascript]
@@ -1734,7 +1786,7 @@ end
1734
1786
 
1735
1787
  `script_name`や`path_info`などのオプションは次のように利用することもできます。
1736
1788
 
1737
- ``` ruby
1789
+ ```ruby
1738
1790
  before { request.path_info = "/" }
1739
1791
 
1740
1792
  get "/" do
@@ -1744,7 +1796,7 @@ end
1744
1796
 
1745
1797
  `request.body`はIOまたはStringIOのオブジェクトです。
1746
1798
 
1747
- ``` ruby
1799
+ ```ruby
1748
1800
  post "/api" do
1749
1801
  request.body.rewind # 既に読まれているときのため
1750
1802
  data = JSON.parse request.body.read
@@ -1756,7 +1808,7 @@ end
1756
1808
 
1757
1809
  `attachment`ヘルパーを使って、レスポンスがブラウザに表示されるのではなく、ディスクに保存されることをブラウザに対し通知することができます。
1758
1810
 
1759
- ``` ruby
1811
+ ```ruby
1760
1812
  get '/' do
1761
1813
  attachment
1762
1814
  "保存しました!"
@@ -1765,7 +1817,7 @@ end
1765
1817
 
1766
1818
  ファイル名を渡すこともできます。
1767
1819
 
1768
- ``` ruby
1820
+ ```ruby
1769
1821
  get '/' do
1770
1822
  attachment "info.txt"
1771
1823
  "保存しました!"
@@ -1776,7 +1828,7 @@ end
1776
1828
 
1777
1829
  Sinatraは`time_for`ヘルパーメソッドを提供しており、それは与えられた値からTimeオブジェクトを生成します。これはまた`DateTime`、`Date`および類似のクラスを変換できます。
1778
1830
 
1779
- ``` ruby
1831
+ ```ruby
1780
1832
  get '/' do
1781
1833
  pass if Time.now > time_for('Dec 23, 2012')
1782
1834
  "まだ時間がある"
@@ -1785,7 +1837,7 @@ end
1785
1837
 
1786
1838
  このメソッドは、`expires`、`last_modified`といった種類のものの内部で使われています。そのため、アプリケーションにおいて、`time_for`をオーバーライドすることでそれらのメソッドの挙動を簡単に拡張できます。
1787
1839
 
1788
- ``` ruby
1840
+ ```ruby
1789
1841
  helpers do
1790
1842
  def time_for(value)
1791
1843
  case value
@@ -1807,7 +1859,7 @@ end
1807
1859
 
1808
1860
  `find_template`ヘルパーは、レンダリングのためのテンプレートファイルを見つけるために使われます。
1809
1861
 
1810
- ``` ruby
1862
+ ```ruby
1811
1863
  find_template settings.views, 'foo', Tilt[:haml] do |file|
1812
1864
  puts "could be #{file}"
1813
1865
  end
@@ -1816,7 +1868,7 @@ end
1816
1868
  この例はあまり有益ではありません。しかし、このメソッドを、独自の探索機構で働くようオーバーライドするなら有益になります。例えば、複数のビューディレクトリを使えるようにしたいときがあります。
1817
1869
 
1818
1870
 
1819
- ``` ruby
1871
+ ```ruby
1820
1872
  set :views, ['views', 'templates']
1821
1873
 
1822
1874
  helpers do
@@ -1828,7 +1880,7 @@ end
1828
1880
 
1829
1881
  他の例としては、異なるエンジン用の異なるディレクトリを使う場合です。
1830
1882
 
1831
- ``` ruby
1883
+ ```ruby
1832
1884
  set :views, :sass => 'views/sass', :haml => 'templates', :default => 'views'
1833
1885
 
1834
1886
  helpers do
@@ -1848,7 +1900,7 @@ end
1848
1900
 
1849
1901
  どの環境でも起動時に1回だけ実行されます。
1850
1902
 
1851
- ``` ruby
1903
+ ```ruby
1852
1904
  configure do
1853
1905
  # 1つのオプションをセット
1854
1906
  set :option, 'value'
@@ -1867,9 +1919,9 @@ configure do
1867
1919
  end
1868
1920
  ```
1869
1921
 
1870
- 環境設定(`RACK_ENV`環境変数)が`:production`に設定されている時だけ実行する方法:
1922
+ 環境設定(`APP_ENV`環境変数)が`:production`に設定されている時だけ実行する方法:
1871
1923
 
1872
- ``` ruby
1924
+ ```ruby
1873
1925
  configure :production do
1874
1926
  ...
1875
1927
  end
@@ -1877,7 +1929,7 @@ end
1877
1929
 
1878
1930
  環境設定が`:production`か`:test`に設定されている時だけ実行する方法:
1879
1931
 
1880
- ``` ruby
1932
+ ```ruby
1881
1933
  configure :production, :test do
1882
1934
  ...
1883
1935
  end
@@ -1885,7 +1937,7 @@ end
1885
1937
 
1886
1938
  設定したオプションには`settings`からアクセスできます:
1887
1939
 
1888
- ``` ruby
1940
+ ```ruby
1889
1941
  configure do
1890
1942
  set :foo, 'bar'
1891
1943
  end
@@ -1899,26 +1951,27 @@ end
1899
1951
 
1900
1952
  ### 攻撃防御に対する設定
1901
1953
 
1902
- Sinatraは、[Rack::Protection](https://github.com/rkh/rack-protection#readme)を使って、アプリケーションを多発する日和見的攻撃から守っています。この挙動は簡単に無効化できます(これはアプリケーションを大量の脆弱性攻撃に晒すことになります)。
1954
+ Sinatra[Rack::Protection](https://github.com/sinatra/rack-protection#readme)を使用することで、アプリケーションを一般的な日和見的攻撃から守っています。これは簡単に無効化できます(が、アプリケーションに大量の一般的な脆弱性を埋め込むことになってしまいます)。
1903
1955
 
1904
- ``` ruby
1956
+ ```ruby
1905
1957
  disable :protection
1906
1958
  ```
1907
1959
 
1908
- 単一の防御層を外すためには、`protection`をオプションハッシュにセットします。
1960
+ ある1つの防御を無効にするには、`protection`にハッシュでオプションを指定します。
1909
1961
 
1910
- ``` ruby
1962
+ ```ruby
1911
1963
  set :protection, :except => :path_traversal
1912
1964
  ```
1913
- また配列を渡して、複数の防御を無効にすることもできます。
1914
1965
 
1915
- ``` ruby
1966
+ 配列を渡すことで、複数の防御を無効にすることもできます。
1967
+
1968
+ ```ruby
1916
1969
  set :protection, :except => [:path_traversal, :session_hijacking]
1917
1970
  ```
1918
1971
 
1919
1972
  デフォルトでSinatraは、`:sessions`が有効になっている場合、セッションベースの防御だけを設定します。しかし、自身でセッションを設定したい場合があります。その場合は、`:session`オプションを渡すことにより、セッションベースの防御を設定することができます。
1920
1973
 
1921
- ``` ruby
1974
+ ```ruby
1922
1975
  use Rack::Session::Pool
1923
1976
  set :protection, :session => true
1924
1977
  ```
@@ -1957,7 +2010,7 @@ set :protection, :session => true
1957
2010
 
1958
2011
  <dt>environment</dt>
1959
2012
  <dd>
1960
- 現在の環境。デフォルトは<tt>ENV['RACK_ENV']</tt>、それが無い場合は<tt>"development"</tt>。
2013
+ 現在の環境。デフォルトは<tt>ENV['APP_ENV']</tt>、それが無い場合は<tt>"development"</tt>。
1961
2014
  </dd>
1962
2015
 
1963
2016
  <dt>logging</dt>
@@ -2069,17 +2122,17 @@ set :protection, :session => true
2069
2122
 
2070
2123
  ## 環境設定(Environments)
2071
2124
 
2072
- 3種類の既定環境、`"development"`、`"production"`および`"test"`があります。環境は、`RACK_ENV`環境変数を通して設定できます。デフォルト値は、`"development"`です。`"development"`環境において、すべてのテンプレートは、各リクエスト間で再ロードされ、そして、特別の`not_found`および`error`ハンドラがブラウザにスタックトレースを表示します。`"production"`および`"test"`環境においては、テンプレートはデフォルトでキャッシュされます。
2125
+ 3種類の既定環境、`"development"`、`"production"`および`"test"`があります。環境は、`APP_ENV`環境変数を通して設定できます。デフォルト値は、`"development"`です。`"development"`環境において、すべてのテンプレートは、各リクエスト間で再ロードされ、そして、特別の`not_found`および`error`ハンドラがブラウザにスタックトレースを表示します。`"production"`および`"test"`環境においては、テンプレートはデフォルトでキャッシュされます。
2073
2126
 
2074
- 異なる環境を走らせるには、`RACK_ENV`環境変数を設定します。
2127
+ 異なる環境を走らせるには、`APP_ENV`環境変数を設定します。
2075
2128
 
2076
- ``` shell
2077
- RACK_ENV=production ruby my_app.rb
2129
+ ```shell
2130
+ APP_ENV=production ruby my_app.rb
2078
2131
  ```
2079
2132
 
2080
2133
  既定メソッド、`development?`、`test?`および`production?`を、現在の環境設定を確認するために使えます。
2081
2134
 
2082
- ``` ruby
2135
+ ```ruby
2083
2136
  get '/' do
2084
2137
  if settings.development?
2085
2138
  "development!"
@@ -2097,7 +2150,7 @@ end
2097
2150
 
2098
2151
  `Sinatra::NotFound`例外が発生したとき、またはレスポンスのステータスコードが404のときに、`not_found`ハンドラが発動します。
2099
2152
 
2100
- ``` ruby
2153
+ ```ruby
2101
2154
  not_found do
2102
2155
  'ファイルが存在しません'
2103
2156
  end
@@ -2105,9 +2158,16 @@ end
2105
2158
 
2106
2159
  ### エラー(Error)
2107
2160
 
2108
- `error`ハンドラはルーティングブロックまたはフィルタ内で例外が発生したときはいつでも発動します。例外オブジェクトはRack変数`sinatra.error`から取得できます。
2161
+ `error`ハンドラはルーティングブロックまたはフィルタ内で例外が発生したときはいつでも発動します。
2162
+ しかし、環境設定がdevelopmentの場合は`:after_handler`を設定している場合のみ発動するようになります。
2163
+
2164
+ ```ruby
2165
+ set :show_exceptions, :after_handler
2166
+ ```
2167
+
2168
+ 例外オブジェクトはRack変数`sinatra.error`から取得できます。
2109
2169
 
2110
- ``` ruby
2170
+ ```ruby
2111
2171
  error do
2112
2172
  'エラーが発生しました。 - ' + env['sinatra.error'].message
2113
2173
  end
@@ -2115,7 +2175,7 @@ end
2115
2175
 
2116
2176
  エラーをカスタマイズする場合は、
2117
2177
 
2118
- ``` ruby
2178
+ ```ruby
2119
2179
  error MyCustomError do
2120
2180
  'エラーメッセージ...' + env['sinatra.error'].message
2121
2181
  end
@@ -2123,7 +2183,7 @@ end
2123
2183
 
2124
2184
  と書いておいて、下記のように呼び出します。
2125
2185
 
2126
- ``` ruby
2186
+ ```ruby
2127
2187
  get '/' do
2128
2188
  raise MyCustomError, '何かがまずかったようです'
2129
2189
  end
@@ -2137,7 +2197,7 @@ end
2137
2197
 
2138
2198
  あるいは、ステータスコードに対応するエラーハンドラを設定することもできます。
2139
2199
 
2140
- ``` ruby
2200
+ ```ruby
2141
2201
  error 403 do
2142
2202
  'Access forbidden'
2143
2203
  end
@@ -2149,7 +2209,7 @@ end
2149
2209
 
2150
2210
  範囲指定もできます。
2151
2211
 
2152
- ``` ruby
2212
+ ```ruby
2153
2213
  error 400..510 do
2154
2214
  'Boom'
2155
2215
  end
@@ -2157,14 +2217,13 @@ end
2157
2217
 
2158
2218
  Sinatraを開発環境の下で実行している場合は、特別な`not_found`および`error`ハンドラが導入され、これは親切なスタックトレースと追加のデバッギング情報をブラウザに表示します。
2159
2219
 
2160
-
2161
2220
  ## Rackミドルウェア(Rack Middleware)
2162
2221
 
2163
2222
  SinatraはRuby製Webフレームワークのミニマルな標準的インタフェースである[Rack](http://rack.github.io/)上に構築されています。アプリケーションデベロッパーにとってRackにおける最も興味深い機能は、「ミドルウェア(middleware)」をサポートしていることであり、これは、サーバとアプリケーションとの間に置かれ、HTTPリクエスト/レスポンスを監視および/または操作することで、各種の汎用的機能を提供するコンポーネントです。
2164
2223
 
2165
2224
  Sinatraはトップレベルの`use`メソッドを通して、Rackミドルウェアパイプラインの構築を楽にします。
2166
2225
 
2167
- ``` ruby
2226
+ ```ruby
2168
2227
  require 'sinatra'
2169
2228
  require 'my_custom_middleware'
2170
2229
 
@@ -2176,9 +2235,9 @@ get '/hello' do
2176
2235
  end
2177
2236
  ```
2178
2237
 
2179
- `use`の文法は、[Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder)DSLで定義されているそれ(rackupファイルで最もよく使われる)と同じです。例えば `use`メソッドは複数の引数、そしてブロックも取ることができます。
2238
+ `use`の文法は、[Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder)DSLで定義されているそれ(rackupファイルで最もよく使われる)と同じです。例えば `use`メソッドは複数の引数、そしてブロックも取ることができます。
2180
2239
 
2181
- ``` ruby
2240
+ ```ruby
2182
2241
  use Rack::Auth::Basic do |username, password|
2183
2242
  username == 'admin' && password == 'secret'
2184
2243
  end
@@ -2194,9 +2253,9 @@ Rackは、ロギング、デバッギング、URLルーティング、認証、
2194
2253
 
2195
2254
  ## テスト(Testing)
2196
2255
 
2197
- SinatraでのテストはRackベースのテストライブラリまたはフレームワークを使って書くことができます。[Rack::Test](http://rdoc.info/github/brynary/rack-test/master/frames)をお薦めします。
2256
+ SinatraでのテストはRackベースのテストライブラリまたはフレームワークを使って書くことができます。[Rack::Test](http://www.rubydoc.info/github/brynary/rack-test/master/frames)をお薦めします。
2198
2257
 
2199
- ``` ruby
2258
+ ```ruby
2200
2259
  require 'my_sinatra_app'
2201
2260
  require 'minitest/autorun'
2202
2261
  require 'rack/test'
@@ -2218,7 +2277,7 @@ class MyAppTest < Minitest::Test
2218
2277
  assert_equal 'Hello Frank!', last_response.body
2219
2278
  end
2220
2279
 
2221
- def test_with_rack_env
2280
+ def test_with_user_agent
2222
2281
  get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
2223
2282
  assert_equal "Songbirdを使ってます!", last_response.body
2224
2283
  end
@@ -2231,7 +2290,7 @@ end
2231
2290
 
2232
2291
  軽量なアプリケーションであれば、トップレベルでアプリケーションを定義していくことはうまくいきますが、再利用性可能なコンポーネント、例えばRackミドルウェア、RailsのMetal、サーバコンポーネントを含むシンプルなライブラリ、あるいはSinatraの拡張プログラムを構築するような場合、これは無視できない欠点を持つものとなります。トップレベルは、軽量なアプリケーションのスタイルにおける設定(例えば、単一のアプリケーションファイル、`./public`および`./views`ディレクトリ、ロギング、例外詳細ページなど)を仮定しています。そこで`Sinatra::Base`の出番です。
2233
2292
 
2234
- ``` ruby
2293
+ ```ruby
2235
2294
  require 'sinatra/base'
2236
2295
 
2237
2296
  class MyApp < Sinatra::Base
@@ -2244,13 +2303,13 @@ class MyApp < Sinatra::Base
2244
2303
  end
2245
2304
  ```
2246
2305
 
2247
- `Sinatra::Base`のサブクラスで利用できるメソッドは、トップレベルDSLで利用できるものと全く同じです。ほとんどのトップレベルで記述されたアプリは、以下の2点を修正することで`Sinatra::Base`コンポーネントに変えることができます。
2306
+ `Sinatra::Base`のサブクラスで利用できるメソッドは、トップレベルDSLで利用できるものと全く同じです。ほとんどのトップレベルで記述されたアプリは、以下の2点を修正することで`Sinatra::Base`コンポーネントに変えることができます。
2248
2307
 
2249
2308
  * `sinatra`の代わりに`sinatra/base`を読み込む
2250
2309
  (そうしない場合、SinatraのDSLメソッドの全てがmainの名前空間にインポートされます)
2251
2310
  * ルーティング、エラーハンドラ、フィルタ、オプションを`Sinatra::Base`のサブクラスに書く
2252
2311
 
2253
- `Sinatra::Base`はまっさらです。ビルトインサーバを含む、ほとんどのオプションがデフォルトで無効になっています。利用可能なオプションとその挙動の詳細については[Configuring Settings](http://sinatra.github.com/configuration.html)(英語)をご覧下さい。
2312
+ `Sinatra::Base`はまっさらです。ビルトインサーバを含む、ほとんどのオプションがデフォルトで無効になっています。利用可能なオプションとその挙動の詳細については[Configuring Settings](http://www.sinatrarb.com/configuration.html)(英語)をご覧ください。
2254
2313
 
2255
2314
  もしもクラシックスタイルと同じような挙動のアプリケーションをトップレベルで定義させる必要があれば、`Sinatra::Application`をサブクラス化させてください。
2256
2315
 
@@ -2318,7 +2377,7 @@ end
2318
2377
  <tr>
2319
2378
  <td>static</td>
2320
2379
  <td>true</td>
2321
- <td>false</td>
2380
+ <td>File.exist?(public_folder)</td>
2322
2381
  <td>true</td>
2323
2382
  </tr>
2324
2383
  </table>
@@ -2327,7 +2386,7 @@ end
2327
2386
 
2328
2387
  モジュラーアプリケーションを開始、つまり`run!`を使って開始させる二種類のやり方があります。
2329
2388
 
2330
- ``` ruby
2389
+ ```ruby
2331
2390
  # my_app.rb
2332
2391
  require 'sinatra/base'
2333
2392
 
@@ -2341,13 +2400,13 @@ end
2341
2400
 
2342
2401
  として、次のように起動するか、
2343
2402
 
2344
- ``` shell
2403
+ ```shell
2345
2404
  ruby my_app.rb
2346
2405
  ```
2347
2406
 
2348
2407
  または、Rackハンドラを使えるようにする`config.ru`ファイルを書いて、
2349
2408
 
2350
- ``` ruby
2409
+ ```ruby
2351
2410
  # config.ru (rackupで起動)
2352
2411
  require './my_app'
2353
2412
  run MyApp
@@ -2355,7 +2414,7 @@ run MyApp
2355
2414
 
2356
2415
  起動します。
2357
2416
 
2358
- ``` shell
2417
+ ```shell
2359
2418
  rackup -p 4567
2360
2419
  ```
2361
2420
 
@@ -2363,7 +2422,7 @@ rackup -p 4567
2363
2422
 
2364
2423
  アプリケーションファイルと、
2365
2424
 
2366
- ``` ruby
2425
+ ```ruby
2367
2426
  # app.rb
2368
2427
  require 'sinatra'
2369
2428
 
@@ -2374,7 +2433,7 @@ end
2374
2433
 
2375
2434
  対応する`config.ru`を書きます。
2376
2435
 
2377
- ``` ruby
2436
+ ```ruby
2378
2437
  require './app'
2379
2438
  run Sinatra::Application
2380
2439
  ```
@@ -2396,7 +2455,7 @@ Sinatraは他のRackミドルウェアを利用することができるだけで
2396
2455
 
2397
2456
  このエンドポイントには、別のSinatraアプリケーションまたは他のRackベースのアプリケーション(Rails/Ramaze/Camping/…)が用いられるでしょう。
2398
2457
 
2399
- ``` ruby
2458
+ ```ruby
2400
2459
  require 'sinatra/base'
2401
2460
 
2402
2461
  class LoginScreen < Sinatra::Base
@@ -2431,7 +2490,7 @@ end
2431
2490
 
2432
2491
  新しいアプリケーションを実行時に、定数に割り当てることなく生成したくなる場合があるでしょう。`Sinatra.new`を使えばそれができます。
2433
2492
 
2434
- ``` ruby
2493
+ ```ruby
2435
2494
  require 'sinatra/base'
2436
2495
  my_app = Sinatra.new { get('/') { "hi" } }
2437
2496
  my_app.run!
@@ -2461,7 +2520,7 @@ end
2461
2520
 
2462
2521
  これはまた、Sinatraをミドルウェアとして利用することを極めて簡単にします。
2463
2522
 
2464
- ``` ruby
2523
+ ```ruby
2465
2524
  require 'sinatra/base'
2466
2525
 
2467
2526
  use Sinatra do
@@ -2485,7 +2544,7 @@ run RailsProject::Application
2485
2544
 
2486
2545
  `set`によって作られたオプションはクラスレベルのメソッドです。
2487
2546
 
2488
- ``` ruby
2547
+ ```ruby
2489
2548
  class MyApp < Sinatra::Base
2490
2549
  # アプリケーションスコープの中だよ!
2491
2550
  set :foo, 42
@@ -2516,7 +2575,7 @@ end
2516
2575
  このスコープの内側からは`request`や`session`オブジェクトにアクセスすることができ、`erb`や`haml`のようなレンダリングメソッドを呼び出すことができます。
2517
2576
  リクエストスコープの内側からは、`settings`ヘルパーによってアプリケーションスコープにアクセスすることができます。
2518
2577
 
2519
- ``` ruby
2578
+ ```ruby
2520
2579
  class MyApp < Sinatra::Base
2521
2580
  # アプリケーションスコープの中だよ!
2522
2581
  get '/define_route/:name' do
@@ -2560,7 +2619,7 @@ mixin](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/base.rb#L1609
2560
2619
 
2561
2620
  Sinatraアプリケーションは直接実行できます。
2562
2621
 
2563
- ``` shell
2622
+ ```shell
2564
2623
  ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
2565
2624
  ```
2566
2625
 
@@ -2575,6 +2634,37 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
2575
2634
  -x # mutex lockを付ける (デフォルトはoff)
2576
2635
  ```
2577
2636
 
2637
+ ### マルチスレッド
2638
+
2639
+ _この[StackOverflow][so-answer]でのKonstantinによる回答を言い換えています。_
2640
+
2641
+ Sinatraでは同時実行モデルを負わせることはできませんが、根本的な部分であるThinやPuma、WebrickのようなRackハンドラ(サーバー)部分に委ねることができます。
2642
+ Sinatra自身はスレッドセーフであり、もしRackハンドラが同時実行モデルのスレッドを使用していても問題はありません。
2643
+ つまり、これはサーバーを起動させる時、特定のRackハンドラに対して正しい起動処理を特定することが出来ます。
2644
+ この例はThinサーバーをマルチスレッドで起動する方法のデモです。
2645
+
2646
+ ```ruby
2647
+ # app.rb
2648
+
2649
+ require 'sinatra/base'
2650
+
2651
+ class App < Sinatra::Base
2652
+ get '/' do
2653
+ "Hello, World"
2654
+ end
2655
+ end
2656
+
2657
+ App.run!
2658
+ ```
2659
+
2660
+ サーバーを開始するコマンドです。
2661
+
2662
+ ```
2663
+ thin --threaded start
2664
+ ```
2665
+
2666
+ [so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
2667
+
2578
2668
  ## 必要環境
2579
2669
 
2580
2670
  次のRubyバージョンが公式にサポートされています。
@@ -2636,7 +2726,7 @@ Sinatraは現在、Cardinal、SmallRuby、BlueRubyまたは1.8.7以前のバー
2636
2726
 
2637
2727
  Sinatraの最新開発版のコードを使いたい場合は、マスターブランチに対してアプリケーションを走らせて構いません。ある程度安定しています。また、適宜プレリリース版gemをpushしているので、
2638
2728
 
2639
- ``` shell
2729
+ ```shell
2640
2730
  gem install sinatra --pre
2641
2731
  ```
2642
2732
 
@@ -2644,11 +2734,11 @@ gem install sinatra --pre
2644
2734
 
2645
2735
  ### Bundlerを使う場合
2646
2736
 
2647
- 最新のSinatraでアプリケーションを動作させたい場合には、[Bundler](http://gembundler.com/)を使うのがお薦めのやり方です。
2737
+ 最新のSinatraでアプリケーションを動作させたい場合には、[Bundler](http://bundler.io)を使うのがお薦めのやり方です。
2648
2738
 
2649
2739
  まず、Bundlerがなければそれをインストールします。
2650
2740
 
2651
- ``` shell
2741
+ ```shell
2652
2742
  gem install bundler
2653
2743
  ```
2654
2744
 
@@ -2667,7 +2757,7 @@ gem 'activerecord', '~> 3.0' # ActiveRecord 3.xが必要かもしれません
2667
2757
 
2668
2758
  これで、以下のようにしてアプリケーションを起動することができます。
2669
2759
 
2670
- ``` shell
2760
+ ```shell
2671
2761
  bundle exec ruby myapp.rb
2672
2762
  ```
2673
2763
 
@@ -2675,7 +2765,7 @@ bundle exec ruby myapp.rb
2675
2765
 
2676
2766
  ローカルにクローンを作って、`sinatra/lib`ディレクトリを`$LOAD_PATH`に追加してアプリケーションを起動します。
2677
2767
 
2678
- ``` shell
2768
+ ```shell
2679
2769
  cd myapp
2680
2770
  git clone git://github.com/sinatra/sinatra.git
2681
2771
  ruby -I sinatra/lib myapp.rb
@@ -2683,7 +2773,7 @@ ruby -I sinatra/lib myapp.rb
2683
2773
 
2684
2774
  追ってSinatraのソースを更新する方法。
2685
2775
 
2686
- ``` shell
2776
+ ```shell
2687
2777
  cd myapp/sinatra
2688
2778
  git pull
2689
2779
  ```
@@ -2692,7 +2782,7 @@ git pull
2692
2782
 
2693
2783
  Sinatraのgemを自身でビルドすることもできます。
2694
2784
 
2695
- ``` shell
2785
+ ```shell
2696
2786
  git clone git://github.com/sinatra/sinatra.git
2697
2787
  cd sinatra
2698
2788
  rake sinatra.gemspec
@@ -2701,7 +2791,7 @@ rake install
2701
2791
 
2702
2792
  gemをルートとしてインストールする場合は、最後のステップはこうなります。
2703
2793
 
2704
- ``` shell
2794
+ ```shell
2705
2795
  sudo rake install
2706
2796
  ```
2707
2797
 
@@ -2711,14 +2801,14 @@ Sinatraは、[Semantic Versioning](http://semver.org/)におけるSemVerおよ
2711
2801
 
2712
2802
  ## 参考文献
2713
2803
 
2714
- * [プロジェクトサイト](http://sinatra.github.com/) - ドキュメント、ニュース、他のリソースへのリンクがあります。
2715
- * [プロジェクトに参加(貢献)する](http://sinatra.github.com/contributing.html) - バグレポート パッチの送信、サポートなど
2716
- * [Issue tracker](http://github.com/sinatra/sinatra/issues)
2717
- * [Twitter](http://twitter.com/sinatra)
2804
+ * [プロジェクトサイト](http://www.sinatrarb.com/) - ドキュメント、ニュース、他のリソースへのリンクがあります。
2805
+ * [プロジェクトに参加(貢献)する](http://www.sinatrarb.com/contributing.html) - バグレポート パッチの送信、サポートなど
2806
+ * [Issue tracker](https://github.com/sinatra/sinatra/issues)
2807
+ * [Twitter](https://twitter.com/sinatra)
2718
2808
  * [メーリングリスト](http://groups.google.com/group/sinatrarb/topics)
2719
2809
  * http://freenode.net上のIRC: [#sinatra](irc://chat.freenode.net/#sinatra)
2720
2810
  * [Sinatra Book](https://github.com/sinatra/sinatra-book/) クックブック、チュートリアル
2721
2811
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) コミュニティによるレシピ集
2722
- * http://rubydoc.info上のAPIドキュメント: [最新版(latest release)用](http://rubydoc.info/gems/sinatra)または[現在のHEAD用](http://rubydoc.info/github/sinatra/sinatra)
2723
- * [CIサーバ](http://travis-ci.org/sinatra/sinatra)
2812
+ * http://www.rubydoc.info/上のAPIドキュメント: [最新版(latest release)用](http://www.rubydoc.info/gems/sinatra)または[現在のHEAD用](http://www.rubydoc.info/github/sinatra/sinatra)
2813
+ * [CIサーバ](https://travis-ci.org/sinatra/sinatra)
2724
2814
  * [Greenbear Laboratory Rack日本語マニュアル](http://route477.net/w/RackReferenceJa.html)