sinatra 1.4.8 → 2.0.8.1

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 (129) hide show
  1. checksums.yaml +5 -5
  2. data/AUTHORS.md +1 -0
  3. data/CHANGELOG.md +238 -54
  4. data/CONTRIBUTING.md +8 -8
  5. data/Gemfile +47 -47
  6. data/LICENSE +4 -1
  7. data/MAINTENANCE.md +42 -0
  8. data/README.de.md +650 -442
  9. data/README.es.md +738 -357
  10. data/README.fr.md +15 -15
  11. data/README.hu.md +37 -3
  12. data/README.ja.md +124 -66
  13. data/README.ko.md +14 -14
  14. data/README.malayalam.md +3141 -0
  15. data/README.md +530 -403
  16. data/README.pt-br.md +2361 -334
  17. data/README.pt-pt.md +2 -2
  18. data/README.ru.md +856 -607
  19. data/README.zh.md +90 -28
  20. data/Rakefile +77 -51
  21. data/SECURITY.md +35 -0
  22. data/VERSION +1 -0
  23. data/lib/sinatra/base.rb +177 -239
  24. data/lib/sinatra/indifferent_hash.rb +200 -0
  25. data/lib/sinatra/main.rb +30 -10
  26. data/lib/sinatra/show_exceptions.rb +102 -62
  27. data/lib/sinatra/version.rb +1 -1
  28. data/sinatra.gemspec +44 -8
  29. metadata +41 -166
  30. data/lib/sinatra/ext.rb +0 -17
  31. data/test/asciidoctor_test.rb +0 -72
  32. data/test/base_test.rb +0 -167
  33. data/test/builder_test.rb +0 -91
  34. data/test/coffee_test.rb +0 -96
  35. data/test/compile_test.rb +0 -183
  36. data/test/contest.rb +0 -91
  37. data/test/creole_test.rb +0 -65
  38. data/test/delegator_test.rb +0 -160
  39. data/test/encoding_test.rb +0 -20
  40. data/test/erb_test.rb +0 -116
  41. data/test/extensions_test.rb +0 -98
  42. data/test/filter_test.rb +0 -487
  43. data/test/haml_test.rb +0 -109
  44. data/test/helper.rb +0 -132
  45. data/test/helpers_test.rb +0 -1917
  46. data/test/integration/app.rb +0 -79
  47. data/test/integration_helper.rb +0 -236
  48. data/test/integration_test.rb +0 -104
  49. data/test/less_test.rb +0 -69
  50. data/test/liquid_test.rb +0 -77
  51. data/test/mapped_error_test.rb +0 -285
  52. data/test/markaby_test.rb +0 -80
  53. data/test/markdown_test.rb +0 -85
  54. data/test/mediawiki_test.rb +0 -68
  55. data/test/middleware_test.rb +0 -68
  56. data/test/nokogiri_test.rb +0 -67
  57. data/test/public/favicon.ico +0 -0
  58. data/test/public/hello+world.txt +0 -1
  59. data/test/rabl_test.rb +0 -89
  60. data/test/rack_test.rb +0 -45
  61. data/test/radius_test.rb +0 -59
  62. data/test/rdoc_test.rb +0 -66
  63. data/test/readme_test.rb +0 -130
  64. data/test/request_test.rb +0 -100
  65. data/test/response_test.rb +0 -63
  66. data/test/result_test.rb +0 -76
  67. data/test/route_added_hook_test.rb +0 -59
  68. data/test/routing_test.rb +0 -1456
  69. data/test/sass_test.rb +0 -115
  70. data/test/scss_test.rb +0 -88
  71. data/test/server_test.rb +0 -56
  72. data/test/settings_test.rb +0 -582
  73. data/test/sinatra_test.rb +0 -12
  74. data/test/slim_test.rb +0 -102
  75. data/test/static_test.rb +0 -266
  76. data/test/streaming_test.rb +0 -149
  77. data/test/stylus_test.rb +0 -90
  78. data/test/templates_test.rb +0 -382
  79. data/test/textile_test.rb +0 -65
  80. data/test/views/a/in_a.str +0 -1
  81. data/test/views/ascii.erb +0 -2
  82. data/test/views/b/in_b.str +0 -1
  83. data/test/views/calc.html.erb +0 -1
  84. data/test/views/error.builder +0 -3
  85. data/test/views/error.erb +0 -3
  86. data/test/views/error.haml +0 -3
  87. data/test/views/error.sass +0 -2
  88. data/test/views/explicitly_nested.str +0 -1
  89. data/test/views/foo/hello.test +0 -1
  90. data/test/views/hello.asciidoc +0 -1
  91. data/test/views/hello.builder +0 -1
  92. data/test/views/hello.coffee +0 -1
  93. data/test/views/hello.creole +0 -1
  94. data/test/views/hello.erb +0 -1
  95. data/test/views/hello.haml +0 -1
  96. data/test/views/hello.less +0 -5
  97. data/test/views/hello.liquid +0 -1
  98. data/test/views/hello.mab +0 -1
  99. data/test/views/hello.md +0 -1
  100. data/test/views/hello.mediawiki +0 -1
  101. data/test/views/hello.nokogiri +0 -1
  102. data/test/views/hello.rabl +0 -2
  103. data/test/views/hello.radius +0 -1
  104. data/test/views/hello.rdoc +0 -1
  105. data/test/views/hello.sass +0 -2
  106. data/test/views/hello.scss +0 -3
  107. data/test/views/hello.slim +0 -1
  108. data/test/views/hello.str +0 -1
  109. data/test/views/hello.styl +0 -2
  110. data/test/views/hello.test +0 -1
  111. data/test/views/hello.textile +0 -1
  112. data/test/views/hello.wlang +0 -1
  113. data/test/views/hello.yajl +0 -1
  114. data/test/views/layout2.builder +0 -3
  115. data/test/views/layout2.erb +0 -2
  116. data/test/views/layout2.haml +0 -2
  117. data/test/views/layout2.liquid +0 -2
  118. data/test/views/layout2.mab +0 -2
  119. data/test/views/layout2.nokogiri +0 -3
  120. data/test/views/layout2.rabl +0 -3
  121. data/test/views/layout2.radius +0 -2
  122. data/test/views/layout2.slim +0 -3
  123. data/test/views/layout2.str +0 -2
  124. data/test/views/layout2.test +0 -1
  125. data/test/views/layout2.wlang +0 -2
  126. data/test/views/nested.str +0 -1
  127. data/test/views/utf8.erb +0 -2
  128. data/test/wlang_test.rb +0 -87
  129. data/test/yajl_test.rb +0 -86
data/README.ja.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Sinatra
2
2
 
3
3
  *注)
4
- 本文書は英語から翻訳したものであり、その内容が最新でない場合もあります。最新の情報はオリジナルの英語版を参照して下さい。*
4
+ 本文書は英語から翻訳したものであり、その内容が最新でない場合もあります。最新の情報はオリジナルの英語版を参照してください。*
5
5
 
6
6
  Sinatraは最小の労力でRubyによるWebアプリケーションを手早く作るための[DSL](https://ja.wikipedia.org/wiki/メインページドメイン固有言語)です。
7
7
 
@@ -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
  * [別ルーティングの誘発](#別ルーティングの誘発)
@@ -160,6 +162,14 @@ end
160
162
  ルーティングは定義された順番にマッチします。
161
163
  リクエストに最初にマッチしたルーティングが呼び出されます。
162
164
 
165
+ トレイリングスラッシュを付けたルートは、そうでないルートと異なったものになります。
166
+
167
+ ```ruby
168
+ get '/foo' do
169
+ # Does not match "GET /foo/"
170
+ end
171
+ ```
172
+
163
173
  ルーティングのパターンは名前付きパラメータを含むことができ、
164
174
  `params`ハッシュで取得できます。
165
175
 
@@ -208,7 +218,7 @@ end
208
218
  ルーティングを正規表現にマッチさせることもできます。
209
219
 
210
220
  ```ruby
211
- get /\A\/hello\/([\w]+)\z/ do
221
+ get /\/hello\/([\w]+)/ do
212
222
  "Hello, #{params['captures'].first}!"
213
223
  end
214
224
  ```
@@ -305,12 +315,12 @@ end
305
315
  Rackレスポンス、Rackボディオブジェクト、HTTPステータスコードのいずれかとして妥当なオブジェクトであればどのようなオブジェクトでも返すことができます。
306
316
 
307
317
  * 3つの要素を含む配列:
308
- `[ステータス(Fixnum), ヘッダ(Hash), レスポンスボディ(#eachに応答する)]`
318
+ `[ステータス(Integer), ヘッダ(Hash), レスポンスボディ(#eachに応答する)]`
309
319
  * 2つの要素を含む配列:
310
- `[ステータス(Fixnum), レスポンスボディ(#eachに応答する)]`
320
+ `[ステータス(Integer), レスポンスボディ(#eachに応答する)]`
311
321
  * `#each`に応答するオブジェクト。通常はそのまま何も返さないが、
312
322
  与えられたブロックに文字列を渡す。
313
- * ステータスコードを表現する整数(Fixnum)
323
+ * ステータスコードを表現する整数(Integer)
314
324
 
315
325
  これにより、例えばストリーミングを簡単に実装することができます。
316
326
 
@@ -365,12 +375,11 @@ end
365
375
  または、否定先読みを使って:
366
376
 
367
377
  ```ruby
368
- get %r{^(?!/index$)} do
378
+ get %r{(?!/index)} do
369
379
  # ...
370
380
  end
371
381
  ```
372
382
 
373
-
374
383
  ## 静的ファイル(Static Files)
375
384
 
376
385
  静的ファイルは`./public`ディレクトリから配信されます。
@@ -418,7 +427,6 @@ end
418
427
 
419
428
  Sinatraが理解できないオプションは、テンプレートエンジンに渡されることになります。
420
429
 
421
-
422
430
  ```ruby
423
431
  get '/' do
424
432
  haml :index, :format => :html5
@@ -448,7 +456,7 @@ end
448
456
 
449
457
  <dt>default_encoding</dt>
450
458
  <dd>
451
- 文字エンコーディング(不確かな場合に使用される)。デフォルトは、<tt>settings.default_encoding</tt>。
459
+ 文字エンコーディングが確実でない場合に指定。デフォルトは、<tt>settings.default_encoding</tt>。
452
460
  </dd>
453
461
 
454
462
  <dt>views</dt>
@@ -490,9 +498,9 @@ end
490
498
  set :views, settings.root + '/templates'
491
499
  ```
492
500
 
493
- テンプレートはシンボルを使用して参照させることを覚えておいて下さい。
494
- サブディレクトリでもこの場合は`:'subdir/template'`のようにします。
495
- レンダリングメソッドは文字列が渡されると、それをそのまま文字列として出力するので、シンボルを使ってください。
501
+ テンプレートの参照は、テンプレートがサブディレクトリ内にある場合でも常にシンボルで指定することを覚えておいてください。
502
+ (これは`:'subdir/template'`または`'subdir/template'.to_sym`のように指定することを意味します。)
503
+ レンダリングメソッドにシンボルではなく文字列を渡してしまうと、そのまま文字列として出力してしまいます。
496
504
 
497
505
  ### リテラルテンプレート(Literal Templates)
498
506
 
@@ -502,13 +510,19 @@ get '/' do
502
510
  end
503
511
  ```
504
512
 
505
- これはそのテンプレート文字列をレンダリングします。
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
+ ```
506
521
 
507
522
  ### 利用可能なテンプレート言語
508
523
 
509
524
  いくつかの言語には複数の実装があります。使用する(そしてスレッドセーフにする)実装を指定するには、それを最初にrequireしてください。
510
525
 
511
-
512
526
  ```ruby
513
527
  require 'rdiscount' # または require 'bluecloth'
514
528
  get('/') { markdown :index }
@@ -531,20 +545,20 @@ get('/') { markdown :index }
531
545
  </tr>
532
546
  </table>
533
547
 
534
-
535
548
  #### Erb テンプレート
536
549
 
537
550
  <table>
538
551
  <tr>
539
552
  <td>依存</td>
540
553
  <td>
541
- <a href="http://www.kuwata-lab.com/erubis/" title="erubis">erubis</a>
554
+ <a href="https://github.com/jeremyevans/erubi" title="erubi">erubi</a>
555
+ または <a href="http://www.kuwata-lab.com/erubis/" title="erubis">erubis</a>
542
556
  または erb (Rubyに同梱)
543
557
  </td>
544
558
  </tr>
545
559
  <tr>
546
560
  <td>ファイル拡張子</td>
547
- <td><tt>.erb</tt>, <tt>.rhtml</tt> or <tt>.erubis</tt> (Erubisだけ)</td>
561
+ <td><tt>.erb</tt>, <tt>.rhtml</tt> または <tt>.erubi</tt> (Erubiだけ) または<tt>.erubis</tt> (Erubisだけ)</td>
548
562
  </tr>
549
563
  <tr>
550
564
  <td>例</td>
@@ -592,13 +606,12 @@ get('/') { markdown :index }
592
606
 
593
607
  インラインテンプレート用にブロックを取ることもできます(例を参照)。
594
608
 
595
-
596
609
  #### Sass テンプレート
597
610
 
598
611
  <table>
599
612
  <tr>
600
613
  <td>依存</td>
601
- <td><a href="http://sass-lang.com/" title="sass">sass</a></td>
614
+ <td><a href="https://sass-lang.com/" title="sass">sass</a></td>
602
615
  </tr>
603
616
  <tr>
604
617
  <td>ファイル拡張子</td>
@@ -610,13 +623,12 @@ get('/') { markdown :index }
610
623
  </tr>
611
624
  </table>
612
625
 
613
-
614
626
  #### Scss テンプレート
615
627
 
616
628
  <table>
617
629
  <tr>
618
630
  <td>依存</td>
619
- <td><a href="http://sass-lang.com/" title="sass">sass</a></td>
631
+ <td><a href="https://sass-lang.com/" title="sass">sass</a></td>
620
632
  </tr>
621
633
  <tr>
622
634
  <td>ファイル拡張子</td>
@@ -650,7 +662,7 @@ get('/') { markdown :index }
650
662
  <table>
651
663
  <tr>
652
664
  <td>依存</td>
653
- <td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
665
+ <td><a href="https://shopify.github.io/liquid/" title="liquid">liquid</a></td>
654
666
  </tr>
655
667
  <tr>
656
668
  <td>ファイル拡張子</td>
@@ -673,8 +685,8 @@ LiquidテンプレートからRubyのメソッド(`yield`を除く)を呼び出
673
685
  次の何れか:
674
686
  <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
675
687
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
676
- <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
677
- <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
688
+ <a href="https://github.com/ged/bluecloth" title="bluecloth">BlueCloth</a>,
689
+ <a href="https://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
678
690
  <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
679
691
  </td>
680
692
  </tr>
@@ -704,7 +716,6 @@ erb :overview, :locals => { :text => markdown(:introduction) }
704
716
 
705
717
  MarkdownからはRubyを呼ぶことができないので、Markdownで書かれたレイアウトを使うことはできません。しかしながら、`:layout_engine`オプションを渡すことでテンプレートのものとは異なるレンダリングエンジンをレイアウトのために使うことができます。
706
718
 
707
-
708
719
  #### Textile テンプレート
709
720
 
710
721
  <table>
@@ -764,7 +775,6 @@ erb :overview, :locals => { :text => rdoc(:introduction) }
764
775
 
765
776
  ノート: 他のテンプレート内で`rdoc`メソッドを呼び出せます。
766
777
 
767
-
768
778
  ```ruby
769
779
  %h1 Hello From Haml!
770
780
  %p= rdoc(:greetings)
@@ -777,7 +787,7 @@ RDocからはRubyを呼ぶことができないので、RDocで書かれたレ
777
787
  <table>
778
788
  <tr>
779
789
  <td>依存</td>
780
- <td><a href="http://asciidoctor.org/" title="Asciidoctor">Asciidoctor</a></td>
790
+ <td><a href="https://asciidoctor.org/" title="Asciidoctor">Asciidoctor</a></td>
781
791
  </tr>
782
792
  <tr>
783
793
  <td>ファイル拡張子</td>
@@ -810,13 +820,12 @@ AsciiDocテンプレートからRubyのメソッドを直接呼び出すこと
810
820
 
811
821
  RadiusテンプレートからRubyのメソッドを直接呼び出すことができないため、ほぼ全ての場合にlocalsを指定する必要があるでしょう。
812
822
 
813
-
814
823
  #### Markaby テンプレート
815
824
 
816
825
  <table>
817
826
  <tr>
818
827
  <td>依存</td>
819
- <td><a href="http://markaby.github.io/" title="Markaby">Markaby</a></td>
828
+ <td><a href="https://markaby.github.io/" title="Markaby">Markaby</a></td>
820
829
  </tr>
821
830
  <tr>
822
831
  <td>ファイル拡張子</td>
@@ -1006,7 +1015,6 @@ end
1006
1015
  </tr>
1007
1016
  </table>
1008
1017
 
1009
-
1010
1018
  テンプレートのソースはRubyの文字列として評価され、その結果のJSON変数は`#to_json`を使って変換されます。
1011
1019
 
1012
1020
  ```ruby
@@ -1059,7 +1067,7 @@ get '/:id' do
1059
1067
  end
1060
1068
  ```
1061
1069
 
1062
- このやり方は他のテンプレート内で部分テンプレートとして表示する時に典型的に使用されます。
1070
+ これは他のテンプレート内で部分テンプレートとして表示する典型的な手法です。
1063
1071
 
1064
1072
  ### `yield`を伴うテンプレートとネストしたレイアウト
1065
1073
 
@@ -1096,7 +1104,6 @@ end
1096
1104
  `liquid`, `slim `, `wlang`。
1097
1105
  また汎用の`render`メソッドもブロックを取れます。
1098
1106
 
1099
-
1100
1107
  ### インラインテンプレート(Inline Templates)
1101
1108
 
1102
1109
  テンプレートはソースファイルの最後で定義することもできます。
@@ -1138,7 +1145,7 @@ get '/' do
1138
1145
  end
1139
1146
  ```
1140
1147
 
1141
- 「layout」というテンプレートが存在する場合、そのテンプレートファイルは他のテンプレートがレンダリングされる度に使用されます。`:layout => false`で個別に、または`set :haml, :layout => false`でデフォルトとして、レイアウトを無効にすることができます。
1148
+ 「layout」という名前のテンプレートが存在する場合は、そのテンプレートファイルは他のテンプレートがレンダリングされる度に使用されます。`:layout => false`で個別に、または`set :haml, :layout => false`でデフォルトとして、レイアウトを無効にすることができます。
1142
1149
 
1143
1150
  ```ruby
1144
1151
  get '/' do
@@ -1172,6 +1179,22 @@ end
1172
1179
 
1173
1180
  これは、`./views/index.myat`をレンダリングします。Tiltについての詳細は、https://github.com/rtomayko/tilt を参照してください。
1174
1181
 
1182
+ ### カスタムロジックを使用したテンプレートの探索
1183
+
1184
+ オリジナルテンプレートの検索メカニズムを実装するためには、`#find_template`メソッドを実装します。
1185
+
1186
+ ```ruby
1187
+ configure do
1188
+ set :views [ './views/a', './views/b' ]
1189
+ end
1190
+
1191
+ def find_template(views, name, engine, &block)
1192
+ Array(views).each do |v|
1193
+ super(v, name, engine, &block)
1194
+ end
1195
+ end
1196
+ ```
1197
+
1175
1198
  ## フィルタ(Filters)
1176
1199
 
1177
1200
  beforeフィルタは、リクエストのルーティングと同じコンテキストで各リクエストの前に評価され、それによってリクエストとレスポンスを変更可能にします。フィルタ内でセットされたインスタンス変数はルーティングとテンプレートからアクセスすることができます。
@@ -1254,10 +1277,9 @@ helpers FooUtils, BarUtils
1254
1277
 
1255
1278
  その効果は、アプリケーションクラスにモジュールをインクルードするのと同じです。
1256
1279
 
1257
-
1258
1280
  ### セッションの使用
1259
1281
 
1260
- セッションはリクエスト間での状態維持のために使用されます。その起動により、ユーザセッションごとに一つのセッションハッシュが与えられます。
1282
+ セッションはリクエスト間での状態維持のために使用されます。セッションを有効化すると、ユーザセッションごとに一つのセッションハッシュが与えられます。
1261
1283
 
1262
1284
  ```ruby
1263
1285
  enable :sessions
@@ -1303,6 +1325,38 @@ foo.comのサブドメイン上のアプリ間でセッションを共有化し
1303
1325
  set :sessions, :domain => '.foo.com'
1304
1326
  ```
1305
1327
 
1328
+ #### セッションミドルウェアの選択
1329
+
1330
+ `enable :sessions`とすることで、クッキー内の全てのデータを実際に保存してしまうことに注意してください。
1331
+ これは、あなたが望む挙動ではない(例えば、大量のデータを保存することでトラフィックが増大してしまう)かもしれません。
1332
+ あなたは、次のいずれかの方法によって、任意のRackセッションミドルウェアを使用することができます。
1333
+
1334
+ ```ruby
1335
+ enable :sessions
1336
+ set :session_store, Rack::Session::Pool
1337
+ ```
1338
+
1339
+ オプションのハッシュを設定するためには、次のようにします。
1340
+
1341
+ ```ruby
1342
+ set :sessions, :expire_after => 2592000
1343
+ set :session_store, Rack::Session::Pool
1344
+ ```
1345
+
1346
+ 他の方法は`enable :sessions`を**しない**で、他のミドルウェアの選択と同様にあなた自身でミドルウェアを選択することです。
1347
+
1348
+ この方法を選択する場合は、セッションベースの保護は**デフォルトで有効にならない**ということに注意することが重要です。
1349
+
1350
+ これを満たすためのRackミドルウェアを追加することが必要になります。
1351
+
1352
+ ```ruby
1353
+ use Rack::Session::Pool, :expire_after => 2592000
1354
+ use Rack::Protection::RemoteToken
1355
+ use Rack::Protection::SessionHijacking
1356
+ ```
1357
+
1358
+ より詳しい情報は、「攻撃防御に対する設定」の項を参照してください。
1359
+
1306
1360
  ### 停止(Halting)
1307
1361
 
1308
1362
  フィルタまたはルーティング内で直ちにリクエストを止める場合
@@ -1360,7 +1414,8 @@ end
1360
1414
 
1361
1415
  ### 別ルーティングの誘発
1362
1416
 
1363
- `pass`を使ってルーティングを飛ばすのではなく、他のルーティングを呼んだ結果を得たいというときがあります。これを実現するには`call`を使えばいいです。
1417
+ `pass`を使ってルーティングを飛ばすのではなく、他のルーティングを呼んだ結果を得たいという場合があります。
1418
+ これは`call`を使用することで実現できます。
1364
1419
 
1365
1420
  ```ruby
1366
1421
  get '/foo' do
@@ -1373,12 +1428,11 @@ get '/bar' do
1373
1428
  end
1374
1429
  ```
1375
1430
 
1376
- ノート: 先の例において、テストを楽にしパフォーマンスを改善するには、`"bar"`を単にヘルパーに移し、`/foo`および`/bar`から使えるようにするのがいいです。
1431
+ ノート: 先の例において、テストを楽にしパフォーマンスを改善するには、`"bar"`を単にヘルパーに移し、`/foo`および`/bar`から使えるようにしたほうが良いです。
1377
1432
 
1378
1433
  リクエストが、その複製物でない同じアプリケーションのインスタンスに送られるようにしたいときは、`call`に代えて`call!`を使ってください。
1379
1434
 
1380
- `call`についての詳細はRackの仕様書を参照してください。
1381
-
1435
+ `call`についての詳細はRackの仕様を参照してください。
1382
1436
 
1383
1437
  ### ボディ、ステータスコードおよびヘッダの設定
1384
1438
 
@@ -1403,7 +1457,7 @@ get '/foo' do
1403
1457
  status 418
1404
1458
  headers \
1405
1459
  "Allow" => "BREW, POST, GET, PROPFIND, WHEN",
1406
- "Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
1460
+ "Refresh" => "Refresh: 20; https://www.ietf.org/rfc/rfc2324.txt"
1407
1461
  body "I'm a tea pot!"
1408
1462
  end
1409
1463
  ```
@@ -1461,11 +1515,12 @@ post '/message' do
1461
1515
  end
1462
1516
  ```
1463
1517
 
1518
+ クライアントはソケットに書き込もうとしている接続を閉じることも可能です。そのため、記述しようとする前に`out.closed?`をチェックすることを勧めます。
1519
+
1464
1520
  ### ロギング(Logging)
1465
1521
 
1466
1522
  リクエストスコープにおいて、`logger`ヘルパーは`Logger`インスタンスを作り出します。
1467
1523
 
1468
-
1469
1524
  ```ruby
1470
1525
  get '/' do
1471
1526
  logger.info "loading data"
@@ -1489,7 +1544,7 @@ end
1489
1544
 
1490
1545
  ### MIMEタイプ(Mime Types)
1491
1546
 
1492
- `send_file`か静的ファイルを使う時、SinatraがMIMEタイプを理解できない場合があります。その時は `mime_type` を使ってファイル拡張子毎に登録して下さい。
1547
+ `send_file`か静的ファイルを使う時、SinatraがMIMEタイプを理解できない場合があります。その時は `mime_type` を使ってファイル拡張子毎に登録してください。
1493
1548
 
1494
1549
  ```ruby
1495
1550
  configure do
@@ -1532,7 +1587,7 @@ end
1532
1587
 
1533
1588
  ```ruby
1534
1589
  redirect to('/bar'), 303
1535
- redirect 'http://www.google.com/', 'wrong place, buddy'
1590
+ redirect 'https://www.google.com/', 'wrong place, buddy'
1536
1591
  ```
1537
1592
 
1538
1593
  また、`redirect back`を使えば、簡単にユーザが来たページへ戻るリダイレクトを作れます。
@@ -1550,7 +1605,6 @@ end
1550
1605
 
1551
1606
  redirectに引数を渡すには、それをクエリーに追加するか、
1552
1607
 
1553
-
1554
1608
  ```ruby
1555
1609
  redirect to('/bar?sum=42')
1556
1610
  ```
@@ -1618,7 +1672,6 @@ etag @article.sha1, :weak
1618
1672
 
1619
1673
  これらのヘルパーは、キャッシングをしてくれませんが、必要な情報をキャッシュに与えてくれます。もし手早いリバースプロキシキャッシングの解決策をお探しなら、 [rack-cache](https://github.com/rtomayko/rack-cache)を試してください。
1620
1674
 
1621
-
1622
1675
  ```ruby
1623
1676
  require "rack/cache"
1624
1677
  require "sinatra"
@@ -1695,7 +1748,6 @@ send_file 'foo.png', :type => :jpg
1695
1748
  </dd>
1696
1749
  </dl>
1697
1750
 
1698
-
1699
1751
  ### リクエストオブジェクトへのアクセス
1700
1752
 
1701
1753
  受信するリクエストオブジェクトは、`request`メソッドを通じてリクエストレベル(フィルタ、ルーティング、エラーハンドラ)からアクセスすることができます。
@@ -1868,7 +1920,7 @@ configure do
1868
1920
  end
1869
1921
  ```
1870
1922
 
1871
- 環境設定(`RACK_ENV`環境変数)が`:production`に設定されている時だけ実行する方法:
1923
+ 環境設定(`APP_ENV`環境変数)が`:production`に設定されている時だけ実行する方法:
1872
1924
 
1873
1925
  ```ruby
1874
1926
  configure :production do
@@ -1900,18 +1952,19 @@ end
1900
1952
 
1901
1953
  ### 攻撃防御に対する設定
1902
1954
 
1903
- Sinatraは、[Rack::Protection](https://github.com/sinatra/rack-protection#readme)を使って、アプリケーションを多発する日和見的攻撃から守っています。この挙動は簡単に無効化できます(これはアプリケーションを大量の脆弱性攻撃に晒すことになります)。
1955
+ Sinatra[Rack::Protection](https://github.com/sinatra/sinatra/tree/master/rack-protection#readme)を使用することで、アプリケーションを一般的な日和見的攻撃から守っています。これは簡単に無効化できます(が、アプリケーションに大量の一般的な脆弱性を埋め込むことになってしまいます)。
1904
1956
 
1905
1957
  ```ruby
1906
1958
  disable :protection
1907
1959
  ```
1908
1960
 
1909
- 単一の防御層を外すためには、`protection`をオプションハッシュにセットします。
1961
+ ある1つの防御を無効にするには、`protection`にハッシュでオプションを指定します。
1910
1962
 
1911
1963
  ```ruby
1912
1964
  set :protection, :except => :path_traversal
1913
1965
  ```
1914
- また配列を渡して、複数の防御を無効にすることもできます。
1966
+
1967
+ 配列を渡すことで、複数の防御を無効にすることもできます。
1915
1968
 
1916
1969
  ```ruby
1917
1970
  set :protection, :except => [:path_traversal, :session_hijacking]
@@ -1958,7 +2011,7 @@ set :protection, :session => true
1958
2011
 
1959
2012
  <dt>environment</dt>
1960
2013
  <dd>
1961
- 現在の環境。デフォルトは<tt>ENV['RACK_ENV']</tt>、それが無い場合は<tt>"development"</tt>。
2014
+ 現在の環境。デフォルトは<tt>ENV['APP_ENV']</tt>、それが無い場合は<tt>"development"</tt>。
1962
2015
  </dd>
1963
2016
 
1964
2017
  <dt>logging</dt>
@@ -2070,12 +2123,12 @@ set :protection, :session => true
2070
2123
 
2071
2124
  ## 環境設定(Environments)
2072
2125
 
2073
- 3種類の既定環境、`"development"`、`"production"`および`"test"`があります。環境は、`RACK_ENV`環境変数を通して設定できます。デフォルト値は、`"development"`です。`"development"`環境において、すべてのテンプレートは、各リクエスト間で再ロードされ、そして、特別の`not_found`および`error`ハンドラがブラウザにスタックトレースを表示します。`"production"`および`"test"`環境においては、テンプレートはデフォルトでキャッシュされます。
2126
+ 3種類の既定環境、`"development"`、`"production"`および`"test"`があります。環境は、`APP_ENV`環境変数を通して設定できます。デフォルト値は、`"development"`です。`"development"`環境において、すべてのテンプレートは、各リクエスト間で再ロードされ、そして、特別の`not_found`および`error`ハンドラがブラウザにスタックトレースを表示します。`"production"`および`"test"`環境においては、テンプレートはデフォルトでキャッシュされます。
2074
2127
 
2075
- 異なる環境を走らせるには、`RACK_ENV`環境変数を設定します。
2128
+ 異なる環境を走らせるには、`APP_ENV`環境変数を設定します。
2076
2129
 
2077
2130
  ```shell
2078
- RACK_ENV=production ruby my_app.rb
2131
+ APP_ENV=production ruby my_app.rb
2079
2132
  ```
2080
2133
 
2081
2134
  既定メソッド、`development?`、`test?`および`production?`を、現在の環境設定を確認するために使えます。
@@ -2106,7 +2159,14 @@ end
2106
2159
 
2107
2160
  ### エラー(Error)
2108
2161
 
2109
- `error`ハンドラはルーティングブロックまたはフィルタ内で例外が発生したときはいつでも発動します。例外オブジェクトはRack変数`sinatra.error`から取得できます。
2162
+ `error`ハンドラはルーティングブロックまたはフィルタ内で例外が発生したときはいつでも発動します。
2163
+ しかし、環境設定がdevelopmentの場合は`:after_handler`を設定している場合のみ発動するようになります。
2164
+
2165
+ ```ruby
2166
+ set :show_exceptions, :after_handler
2167
+ ```
2168
+
2169
+ 例外オブジェクトはRack変数`sinatra.error`から取得できます。
2110
2170
 
2111
2171
  ```ruby
2112
2172
  error do
@@ -2158,10 +2218,9 @@ end
2158
2218
 
2159
2219
  Sinatraを開発環境の下で実行している場合は、特別な`not_found`および`error`ハンドラが導入され、これは親切なスタックトレースと追加のデバッギング情報をブラウザに表示します。
2160
2220
 
2161
-
2162
2221
  ## Rackミドルウェア(Rack Middleware)
2163
2222
 
2164
- SinatraはRuby製Webフレームワークのミニマルな標準的インタフェースである[Rack](http://rack.github.io/)上に構築されています。アプリケーションデベロッパーにとってRackにおける最も興味深い機能は、「ミドルウェア(middleware)」をサポートしていることであり、これは、サーバとアプリケーションとの間に置かれ、HTTPリクエスト/レスポンスを監視および/または操作することで、各種の汎用的機能を提供するコンポーネントです。
2223
+ SinatraはRuby製Webフレームワークのミニマルな標準的インタフェースである[Rack](https://rack.github.io/)上に構築されています。アプリケーションデベロッパーにとってRackにおける最も興味深い機能は、「ミドルウェア(middleware)」をサポートしていることであり、これは、サーバとアプリケーションとの間に置かれ、HTTPリクエスト/レスポンスを監視および/または操作することで、各種の汎用的機能を提供するコンポーネントです。
2165
2224
 
2166
2225
  Sinatraはトップレベルの`use`メソッドを通して、Rackミドルウェアパイプラインの構築を楽にします。
2167
2226
 
@@ -2219,7 +2278,7 @@ class MyAppTest < Minitest::Test
2219
2278
  assert_equal 'Hello Frank!', last_response.body
2220
2279
  end
2221
2280
 
2222
- def test_with_rack_env
2281
+ def test_with_user_agent
2223
2282
  get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
2224
2283
  assert_equal "Songbirdを使ってます!", last_response.body
2225
2284
  end
@@ -2245,13 +2304,13 @@ class MyApp < Sinatra::Base
2245
2304
  end
2246
2305
  ```
2247
2306
 
2248
- `Sinatra::Base`のサブクラスで利用できるメソッドは、トップレベルDSLで利用できるものと全く同じです。ほとんどのトップレベルで記述されたアプリは、以下の2点を修正することで`Sinatra::Base`コンポーネントに変えることができます。
2307
+ `Sinatra::Base`のサブクラスで利用できるメソッドは、トップレベルDSLで利用できるものと全く同じです。ほとんどのトップレベルで記述されたアプリは、以下の2点を修正することで`Sinatra::Base`コンポーネントに変えることができます。
2249
2308
 
2250
2309
  * `sinatra`の代わりに`sinatra/base`を読み込む
2251
2310
  (そうしない場合、SinatraのDSLメソッドの全てがmainの名前空間にインポートされます)
2252
2311
  * ルーティング、エラーハンドラ、フィルタ、オプションを`Sinatra::Base`のサブクラスに書く
2253
2312
 
2254
- `Sinatra::Base`はまっさらです。ビルトインサーバを含む、ほとんどのオプションがデフォルトで無効になっています。利用可能なオプションとその挙動の詳細については[Configuring Settings](http://www.sinatrarb.com/configuration.html)(英語)をご覧下さい。
2313
+ `Sinatra::Base`はまっさらです。ビルトインサーバを含む、ほとんどのオプションがデフォルトで無効になっています。利用可能なオプションとその挙動の詳細については[Configuring Settings](http://www.sinatrarb.com/configuration.html)(英語)をご覧ください。
2255
2314
 
2256
2315
  もしもクラシックスタイルと同じような挙動のアプリケーションをトップレベルで定義させる必要があれば、`Sinatra::Application`をサブクラス化させてください。
2257
2316
 
@@ -2578,7 +2637,8 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
2578
2637
 
2579
2638
  ### マルチスレッド
2580
2639
 
2581
- _この[StackOverflow][so-answer]でのKonstantinによる回答を言い換えています。_
2640
+ _この[StackOverflow](https://stackoverflow.com/a/6282999/5245129)
2641
+ のKonstantinによる回答を言い換えています。_
2582
2642
 
2583
2643
  Sinatraでは同時実行モデルを負わせることはできませんが、根本的な部分であるThinやPuma、WebrickのようなRackハンドラ(サーバー)部分に委ねることができます。
2584
2644
  Sinatra自身はスレッドセーフであり、もしRackハンドラが同時実行モデルのスレッドを使用していても問題はありません。
@@ -2605,8 +2665,6 @@ App.run!
2605
2665
  thin --threaded start
2606
2666
  ```
2607
2667
 
2608
- [so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
2609
-
2610
2668
  ## 必要環境
2611
2669
 
2612
2670
  次のRubyバージョンが公式にサポートされています。
@@ -2676,7 +2734,7 @@ gem install sinatra --pre
2676
2734
 
2677
2735
  ### Bundlerを使う場合
2678
2736
 
2679
- 最新のSinatraでアプリケーションを動作させたい場合には、[Bundler](http://bundler.io)を使うのがお薦めのやり方です。
2737
+ 最新のSinatraでアプリケーションを動作させたい場合には、[Bundler](https://bundler.io)を使うのがお薦めのやり方です。
2680
2738
 
2681
2739
  まず、Bundlerがなければそれをインストールします。
2682
2740
 
@@ -2739,7 +2797,7 @@ sudo rake install
2739
2797
 
2740
2798
  ## バージョニング(Versioning)
2741
2799
 
2742
- Sinatraは、[Semantic Versioning](http://semver.org/)におけるSemVerおよびSemVerTagの両方に準拠しています。
2800
+ Sinatraは、[Semantic Versioning](https://semver.org/)におけるSemVerおよびSemVerTagの両方に準拠しています。
2743
2801
 
2744
2802
  ## 参考文献
2745
2803
 
@@ -2747,7 +2805,7 @@ Sinatraは、[Semantic Versioning](http://semver.org/)におけるSemVerおよ
2747
2805
  * [プロジェクトに参加(貢献)する](http://www.sinatrarb.com/contributing.html) - バグレポート パッチの送信、サポートなど
2748
2806
  * [Issue tracker](https://github.com/sinatra/sinatra/issues)
2749
2807
  * [Twitter](https://twitter.com/sinatra)
2750
- * [メーリングリスト](http://groups.google.com/group/sinatrarb/topics)
2808
+ * [メーリングリスト](https://groups.google.com/group/sinatrarb/topics)
2751
2809
  * http://freenode.net上のIRC: [#sinatra](irc://chat.freenode.net/#sinatra)
2752
2810
  * [Sinatra Book](https://github.com/sinatra/sinatra-book/) クックブック、チュートリアル
2753
2811
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) コミュニティによるレシピ集