sinatra 1.4.8 → 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 (126) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +111 -47
  3. data/CONTRIBUTING.md +1 -1
  4. data/Gemfile +41 -49
  5. data/LICENSE +4 -1
  6. data/MAINTENANCE.md +42 -0
  7. data/README.de.md +644 -436
  8. data/README.es.md +6 -6
  9. data/README.fr.md +9 -9
  10. data/README.hu.md +37 -3
  11. data/README.ja.md +103 -45
  12. data/README.ko.md +8 -8
  13. data/README.md +471 -363
  14. data/README.pt-br.md +3 -3
  15. data/README.pt-pt.md +2 -2
  16. data/README.ru.md +42 -64
  17. data/README.zh.md +8 -8
  18. data/Rakefile +72 -49
  19. data/SECURITY.md +35 -0
  20. data/lib/sinatra/base.rb +137 -195
  21. data/lib/sinatra/indifferent_hash.rb +150 -0
  22. data/lib/sinatra/main.rb +1 -0
  23. data/lib/sinatra/show_exceptions.rb +63 -55
  24. data/lib/sinatra/version.rb +1 -1
  25. data/sinatra.gemspec +19 -7
  26. metadata +30 -164
  27. data/lib/sinatra/ext.rb +0 -17
  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/public/hello+world.txt +0 -1
  56. data/test/rabl_test.rb +0 -89
  57. data/test/rack_test.rb +0 -45
  58. data/test/radius_test.rb +0 -59
  59. data/test/rdoc_test.rb +0 -66
  60. data/test/readme_test.rb +0 -130
  61. data/test/request_test.rb +0 -100
  62. data/test/response_test.rb +0 -63
  63. data/test/result_test.rb +0 -76
  64. data/test/route_added_hook_test.rb +0 -59
  65. data/test/routing_test.rb +0 -1456
  66. data/test/sass_test.rb +0 -115
  67. data/test/scss_test.rb +0 -88
  68. data/test/server_test.rb +0 -56
  69. data/test/settings_test.rb +0 -582
  70. data/test/sinatra_test.rb +0 -12
  71. data/test/slim_test.rb +0 -102
  72. data/test/static_test.rb +0 -266
  73. data/test/streaming_test.rb +0 -149
  74. data/test/stylus_test.rb +0 -90
  75. data/test/templates_test.rb +0 -382
  76. data/test/textile_test.rb +0 -65
  77. data/test/views/a/in_a.str +0 -1
  78. data/test/views/ascii.erb +0 -2
  79. data/test/views/b/in_b.str +0 -1
  80. data/test/views/calc.html.erb +0 -1
  81. data/test/views/error.builder +0 -3
  82. data/test/views/error.erb +0 -3
  83. data/test/views/error.haml +0 -3
  84. data/test/views/error.sass +0 -2
  85. data/test/views/explicitly_nested.str +0 -1
  86. data/test/views/foo/hello.test +0 -1
  87. data/test/views/hello.asciidoc +0 -1
  88. data/test/views/hello.builder +0 -1
  89. data/test/views/hello.coffee +0 -1
  90. data/test/views/hello.creole +0 -1
  91. data/test/views/hello.erb +0 -1
  92. data/test/views/hello.haml +0 -1
  93. data/test/views/hello.less +0 -5
  94. data/test/views/hello.liquid +0 -1
  95. data/test/views/hello.mab +0 -1
  96. data/test/views/hello.md +0 -1
  97. data/test/views/hello.mediawiki +0 -1
  98. data/test/views/hello.nokogiri +0 -1
  99. data/test/views/hello.rabl +0 -2
  100. data/test/views/hello.radius +0 -1
  101. data/test/views/hello.rdoc +0 -1
  102. data/test/views/hello.sass +0 -2
  103. data/test/views/hello.scss +0 -3
  104. data/test/views/hello.slim +0 -1
  105. data/test/views/hello.str +0 -1
  106. data/test/views/hello.styl +0 -2
  107. data/test/views/hello.test +0 -1
  108. data/test/views/hello.textile +0 -1
  109. data/test/views/hello.wlang +0 -1
  110. data/test/views/hello.yajl +0 -1
  111. data/test/views/layout2.builder +0 -3
  112. data/test/views/layout2.erb +0 -2
  113. data/test/views/layout2.haml +0 -2
  114. data/test/views/layout2.liquid +0 -2
  115. data/test/views/layout2.mab +0 -2
  116. data/test/views/layout2.nokogiri +0 -3
  117. data/test/views/layout2.rabl +0 -3
  118. data/test/views/layout2.radius +0 -2
  119. data/test/views/layout2.slim +0 -3
  120. data/test/views/layout2.str +0 -2
  121. data/test/views/layout2.test +0 -1
  122. data/test/views/layout2.wlang +0 -2
  123. data/test/views/nested.str +0 -1
  124. data/test/views/utf8.erb +0 -2
  125. data/test/wlang_test.rb +0 -87
  126. data/test/yajl_test.rb +0 -86
data/README.es.md CHANGED
@@ -117,7 +117,7 @@ end
117
117
  Rutas con Expresiones Regulares:
118
118
 
119
119
  ```ruby
120
- get /\A\/hola\/([\w]+)\z/ do
120
+ get /\/hola\/([\w]+)/ do
121
121
  "Hola, #{params['captures'].first}!"
122
122
  end
123
123
  ```
@@ -282,7 +282,7 @@ end
282
282
  O, usando un lookahead negativo:
283
283
 
284
284
  ```ruby
285
- get %r{^(?!/index$)} do
285
+ get %r{(?!/index)} do
286
286
  # ...
287
287
  end
288
288
  ```
@@ -1654,7 +1654,7 @@ get '/foo' do
1654
1654
  request.ip # dirección IP del cliente
1655
1655
  request.secure? # false (sería true sobre ssl)
1656
1656
  request.forwarded? # true (si se está corriendo atrás de un proxy reverso)
1657
- requuest.env # hash de entorno directamente entregado por Rack
1657
+ request.env # hash de entorno directamente entregado por Rack
1658
1658
  end
1659
1659
  ```
1660
1660
 
@@ -1808,7 +1808,7 @@ configure do
1808
1808
  end
1809
1809
  ```
1810
1810
 
1811
- Ejecutar únicamente cuando el entorno (la variable de entorno RACK_ENV) es
1811
+ Ejecutar únicamente cuando el entorno (la variable de entorno APP_ENV) es
1812
1812
  `:production`:
1813
1813
 
1814
1814
  ```ruby
@@ -1918,7 +1918,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1918
1918
  <dt>environment</dt>
1919
1919
  <dd>
1920
1920
  Entorno actual, por defecto toma el valor de
1921
- <tt>ENV['RACK_ENV']</tt>, o <tt>"development"</tt> si no
1921
+ <tt>ENV['APP_ENV']</tt>, o <tt>"development"</tt> si no
1922
1922
  está disponible.
1923
1923
  </dd>
1924
1924
 
@@ -2080,7 +2080,7 @@ de `production` y `test`, donde se cachean.
2080
2080
  especiales que muestran un stack trace en el navegador cuando son disparados.
2081
2081
 
2082
2082
  Para utilizar alguno de los otros entornos puede asignarse el valor
2083
- correspondiente a la variable de entorno `RACK_ENV`, o bien utilizar la opción
2083
+ correspondiente a la variable de entorno `APP_ENV`, o bien utilizar la opción
2084
2084
  `-e` al ejecutar la aplicación:
2085
2085
 
2086
2086
  ```shell
data/README.fr.md CHANGED
@@ -209,7 +209,7 @@ end
209
209
  Une route peut aussi être définie par une expression régulière :
210
210
 
211
211
  ```ruby
212
- get /\A\/bonjour\/([\w]+)\z/ do
212
+ get /\/bonjour\/([\w]+)/ do
213
213
  "Bonjour, #{params['captures'].first} !"
214
214
  end
215
215
  ```
@@ -390,7 +390,7 @@ end
390
390
  Ou bien en utilisant cette expression regulière :
391
391
 
392
392
  ```ruby
393
- get %r{^(?!/index$)} do
393
+ get %r{(?!/index)} do
394
394
  # ...
395
395
  end
396
396
  ```
@@ -2016,7 +2016,7 @@ configure do
2016
2016
  end
2017
2017
  ```
2018
2018
 
2019
- Lancé si l'environnement (variable d'environnement RACK_ENV) est `:production` :
2019
+ Lancé si l'environnement (variable d'environnement APP_ENV) est `:production` :
2020
2020
 
2021
2021
  ```ruby
2022
2022
  configure :production do
@@ -2121,7 +2121,7 @@ set :protection, :session => true
2121
2121
  </dd>
2122
2122
 
2123
2123
  <dt>environment</dt>
2124
- <dd>environnement courant, par défaut <tt>ENV['RACK_ENV']</tt>, ou
2124
+ <dd>environnement courant, par défaut <tt>ENV['APP_ENV']</tt>, ou
2125
2125
  <tt>"development"</tt> si absent.</dd>
2126
2126
 
2127
2127
  <dt>logging</dt>
@@ -2229,7 +2229,7 @@ set :protection, :session => true
2229
2229
 
2230
2230
  Il existe trois environnements prédéfinis : `"development"`,
2231
2231
  `"production"` et `"test"`. Les environements peuvent être
2232
- sélectionné via la variable d'environnement `RACK_ENV`. Sa valeur par défaut
2232
+ sélectionné via la variable d'environnement `APP_ENV`. Sa valeur par défaut
2233
2233
  est `"development"`. Dans ce mode, tous les templates sont rechargés à
2234
2234
  chaque requête. Des handlers spécifiques pour `not_found` et
2235
2235
  `error` sont installés pour vous permettre d'avoir une pile de trace
@@ -2237,10 +2237,10 @@ dans votre navigateur. En mode `"production"` et `"test"` les
2237
2237
  templates sont mis en cache par défaut.
2238
2238
 
2239
2239
  Pour exécuter votre application dans un environnement différent, définissez la
2240
- variable d'environnement `RACK_ENV` :
2240
+ variable d'environnement `APP_ENV` :
2241
2241
 
2242
- ```shell
2243
- RACK_ENV=production ruby my_app.rb
2242
+ ``` shell
2243
+ APP_ENV=production ruby my_app.rb
2244
2244
  ```
2245
2245
 
2246
2246
  Vous pouvez utiliser une des méthodes `development?`, `test?` et `production?`
@@ -2405,7 +2405,7 @@ class MonTest < Minitest::Test
2405
2405
  assert_equal 'Salut Frank !', last_response.body
2406
2406
  end
2407
2407
 
2408
- def test_avec_rack_env
2408
+ def test_avec_agent
2409
2409
  get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
2410
2410
  assert_equal "Vous utilisez Songbird !", last_response.body
2411
2411
  end
data/README.hu.md CHANGED
@@ -88,7 +88,7 @@ Az útvonalmintákban szerepelhetnek joker paraméterek is, melyeket a
88
88
  Reguláris kifejezéseket is felvehetünk az útvonalba:
89
89
 
90
90
  ```ruby
91
- get /\A\/hello\/([\w]+)\z/ do
91
+ get /\/hello\/([\w]+)/ do
92
92
  "Helló, #{params['captures'].first}!"
93
93
  end
94
94
  ```
@@ -411,7 +411,7 @@ Csak indításkor, de minden környezetre érvényesen fusson le:
411
411
  end
412
412
  ```
413
413
 
414
- Csak akkor fusson le, ha a környezet (a RACK_ENV környezeti változóban)
414
+ Csak akkor fusson le, ha a környezet (a APP_ENV környezeti változóban)
415
415
  `:production`-ra van állítva:
416
416
 
417
417
  ```ruby
@@ -562,7 +562,7 @@ könyvtárat ajánljuk:
562
562
  assert_equal 'Helló Frici!', last_response.body
563
563
  end
564
564
 
565
- def test_with_rack_env
565
+ def test_with_user_agent
566
566
  get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
567
567
  assert_equal "Songbird-öt használsz!", last_response.body
568
568
  end
@@ -649,6 +649,40 @@ Az alábbi kapcsolókat ismeri fel a rendszer:
649
649
  -s # a rack szerver/handler beállítása (alapértelmezetten ez a thin)
650
650
  -x # a mutex lock bekapcsolása (alapértelmezetten ki van kapcsolva)
651
651
 
652
+ ## Több szálon futtatás
653
+
654
+ _Parafrázis [Konstantin StackOverflow válasza][so-answer] alapján_
655
+
656
+ A Sinatra nem szabja meg az konkurenciakezelés módját, hanem az alatta működő
657
+ Rack kezelőre (szerverre) hagyja ezt a feladatot, ami például a Thin, a Puma,
658
+ vagy a WEBrick. A Sinatra önmagában szálbiztos, tehát semmilyen probléma sem
659
+ adódik, ha a Rack kezelő többszálú konkurenciamodellt használ. Ezek szerint
660
+ szerverindításkor meg kell adni a Rack szervernek megfelelő indítási módot.
661
+ A következő példa egy többszálú Thin szerver indítását mutatja be.
662
+
663
+ ```ruby
664
+ # app.rb
665
+
666
+ require 'sinatra/base'
667
+
668
+ class App < Sinatra::Base
669
+ get '/' do
670
+ "Hello, World"
671
+ end
672
+ end
673
+
674
+ App.run!
675
+
676
+ ```
677
+
678
+ A szerverindítás parancsa a következő lenne:
679
+
680
+ ``` shell
681
+ thin --threaded start
682
+ ```
683
+
684
+ [so-answer]: http://stackoverflow.com/a/6282999/1725341
685
+
652
686
  ## Fejlesztői változat
653
687
 
654
688
  Ha a Sinatra legfrissebb, fejlesztői változatát szeretnéd használni,
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
  ```
@@ -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,7 +545,6 @@ get('/') { markdown :index }
531
545
  </tr>
532
546
  </table>
533
547
 
534
-
535
548
  #### Erb テンプレート
536
549
 
537
550
  <table>
@@ -592,7 +605,6 @@ get('/') { markdown :index }
592
605
 
593
606
  インラインテンプレート用にブロックを取ることもできます(例を参照)。
594
607
 
595
-
596
608
  #### Sass テンプレート
597
609
 
598
610
  <table>
@@ -610,7 +622,6 @@ get('/') { markdown :index }
610
622
  </tr>
611
623
  </table>
612
624
 
613
-
614
625
  #### Scss テンプレート
615
626
 
616
627
  <table>
@@ -704,7 +715,6 @@ erb :overview, :locals => { :text => markdown(:introduction) }
704
715
 
705
716
  MarkdownからはRubyを呼ぶことができないので、Markdownで書かれたレイアウトを使うことはできません。しかしながら、`:layout_engine`オプションを渡すことでテンプレートのものとは異なるレンダリングエンジンをレイアウトのために使うことができます。
706
717
 
707
-
708
718
  #### Textile テンプレート
709
719
 
710
720
  <table>
@@ -764,7 +774,6 @@ erb :overview, :locals => { :text => rdoc(:introduction) }
764
774
 
765
775
  ノート: 他のテンプレート内で`rdoc`メソッドを呼び出せます。
766
776
 
767
-
768
777
  ```ruby
769
778
  %h1 Hello From Haml!
770
779
  %p= rdoc(:greetings)
@@ -810,7 +819,6 @@ AsciiDocテンプレートからRubyのメソッドを直接呼び出すこと
810
819
 
811
820
  RadiusテンプレートからRubyのメソッドを直接呼び出すことができないため、ほぼ全ての場合にlocalsを指定する必要があるでしょう。
812
821
 
813
-
814
822
  #### Markaby テンプレート
815
823
 
816
824
  <table>
@@ -1006,7 +1014,6 @@ end
1006
1014
  </tr>
1007
1015
  </table>
1008
1016
 
1009
-
1010
1017
  テンプレートのソースはRubyの文字列として評価され、その結果のJSON変数は`#to_json`を使って変換されます。
1011
1018
 
1012
1019
  ```ruby
@@ -1059,7 +1066,7 @@ get '/:id' do
1059
1066
  end
1060
1067
  ```
1061
1068
 
1062
- このやり方は他のテンプレート内で部分テンプレートとして表示する時に典型的に使用されます。
1069
+ これは他のテンプレート内で部分テンプレートとして表示する典型的な手法です。
1063
1070
 
1064
1071
  ### `yield`を伴うテンプレートとネストしたレイアウト
1065
1072
 
@@ -1096,7 +1103,6 @@ end
1096
1103
  `liquid`, `slim `, `wlang`。
1097
1104
  また汎用の`render`メソッドもブロックを取れます。
1098
1105
 
1099
-
1100
1106
  ### インラインテンプレート(Inline Templates)
1101
1107
 
1102
1108
  テンプレートはソースファイルの最後で定義することもできます。
@@ -1138,7 +1144,7 @@ get '/' do
1138
1144
  end
1139
1145
  ```
1140
1146
 
1141
- 「layout」というテンプレートが存在する場合、そのテンプレートファイルは他のテンプレートがレンダリングされる度に使用されます。`:layout => false`で個別に、または`set :haml, :layout => false`でデフォルトとして、レイアウトを無効にすることができます。
1147
+ 「layout」という名前のテンプレートが存在する場合は、そのテンプレートファイルは他のテンプレートがレンダリングされる度に使用されます。`:layout => false`で個別に、または`set :haml, :layout => false`でデフォルトとして、レイアウトを無効にすることができます。
1142
1148
 
1143
1149
  ```ruby
1144
1150
  get '/' do
@@ -1172,6 +1178,22 @@ end
1172
1178
 
1173
1179
  これは、`./views/index.myat`をレンダリングします。Tiltについての詳細は、https://github.com/rtomayko/tilt を参照してください。
1174
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
+
1175
1197
  ## フィルタ(Filters)
1176
1198
 
1177
1199
  beforeフィルタは、リクエストのルーティングと同じコンテキストで各リクエストの前に評価され、それによってリクエストとレスポンスを変更可能にします。フィルタ内でセットされたインスタンス変数はルーティングとテンプレートからアクセスすることができます。
@@ -1254,10 +1276,9 @@ helpers FooUtils, BarUtils
1254
1276
 
1255
1277
  その効果は、アプリケーションクラスにモジュールをインクルードするのと同じです。
1256
1278
 
1257
-
1258
1279
  ### セッションの使用
1259
1280
 
1260
- セッションはリクエスト間での状態維持のために使用されます。その起動により、ユーザセッションごとに一つのセッションハッシュが与えられます。
1281
+ セッションはリクエスト間での状態維持のために使用されます。セッションを有効化すると、ユーザセッションごとに一つのセッションハッシュが与えられます。
1261
1282
 
1262
1283
  ```ruby
1263
1284
  enable :sessions
@@ -1303,6 +1324,38 @@ foo.comのサブドメイン上のアプリ間でセッションを共有化し
1303
1324
  set :sessions, :domain => '.foo.com'
1304
1325
  ```
1305
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
+
1306
1359
  ### 停止(Halting)
1307
1360
 
1308
1361
  フィルタまたはルーティング内で直ちにリクエストを止める場合
@@ -1360,7 +1413,8 @@ end
1360
1413
 
1361
1414
  ### 別ルーティングの誘発
1362
1415
 
1363
- `pass`を使ってルーティングを飛ばすのではなく、他のルーティングを呼んだ結果を得たいというときがあります。これを実現するには`call`を使えばいいです。
1416
+ `pass`を使ってルーティングを飛ばすのではなく、他のルーティングを呼んだ結果を得たいという場合があります。
1417
+ これは`call`を使用することで実現できます。
1364
1418
 
1365
1419
  ```ruby
1366
1420
  get '/foo' do
@@ -1373,12 +1427,11 @@ get '/bar' do
1373
1427
  end
1374
1428
  ```
1375
1429
 
1376
- ノート: 先の例において、テストを楽にしパフォーマンスを改善するには、`"bar"`を単にヘルパーに移し、`/foo`および`/bar`から使えるようにするのがいいです。
1430
+ ノート: 先の例において、テストを楽にしパフォーマンスを改善するには、`"bar"`を単にヘルパーに移し、`/foo`および`/bar`から使えるようにしたほうが良いです。
1377
1431
 
1378
1432
  リクエストが、その複製物でない同じアプリケーションのインスタンスに送られるようにしたいときは、`call`に代えて`call!`を使ってください。
1379
1433
 
1380
- `call`についての詳細はRackの仕様書を参照してください。
1381
-
1434
+ `call`についての詳細はRackの仕様を参照してください。
1382
1435
 
1383
1436
  ### ボディ、ステータスコードおよびヘッダの設定
1384
1437
 
@@ -1461,11 +1514,12 @@ post '/message' do
1461
1514
  end
1462
1515
  ```
1463
1516
 
1517
+ クライアントはソケットに書き込もうとしている接続を閉じることも可能です。そのため、記述しようとする前に`out.closed?`をチェックすることを勧めます。
1518
+
1464
1519
  ### ロギング(Logging)
1465
1520
 
1466
1521
  リクエストスコープにおいて、`logger`ヘルパーは`Logger`インスタンスを作り出します。
1467
1522
 
1468
-
1469
1523
  ```ruby
1470
1524
  get '/' do
1471
1525
  logger.info "loading data"
@@ -1489,7 +1543,7 @@ end
1489
1543
 
1490
1544
  ### MIMEタイプ(Mime Types)
1491
1545
 
1492
- `send_file`か静的ファイルを使う時、SinatraがMIMEタイプを理解できない場合があります。その時は `mime_type` を使ってファイル拡張子毎に登録して下さい。
1546
+ `send_file`か静的ファイルを使う時、SinatraがMIMEタイプを理解できない場合があります。その時は `mime_type` を使ってファイル拡張子毎に登録してください。
1493
1547
 
1494
1548
  ```ruby
1495
1549
  configure do
@@ -1550,7 +1604,6 @@ end
1550
1604
 
1551
1605
  redirectに引数を渡すには、それをクエリーに追加するか、
1552
1606
 
1553
-
1554
1607
  ```ruby
1555
1608
  redirect to('/bar?sum=42')
1556
1609
  ```
@@ -1618,7 +1671,6 @@ etag @article.sha1, :weak
1618
1671
 
1619
1672
  これらのヘルパーは、キャッシングをしてくれませんが、必要な情報をキャッシュに与えてくれます。もし手早いリバースプロキシキャッシングの解決策をお探しなら、 [rack-cache](https://github.com/rtomayko/rack-cache)を試してください。
1620
1673
 
1621
-
1622
1674
  ```ruby
1623
1675
  require "rack/cache"
1624
1676
  require "sinatra"
@@ -1695,7 +1747,6 @@ send_file 'foo.png', :type => :jpg
1695
1747
  </dd>
1696
1748
  </dl>
1697
1749
 
1698
-
1699
1750
  ### リクエストオブジェクトへのアクセス
1700
1751
 
1701
1752
  受信するリクエストオブジェクトは、`request`メソッドを通じてリクエストレベル(フィルタ、ルーティング、エラーハンドラ)からアクセスすることができます。
@@ -1868,7 +1919,7 @@ configure do
1868
1919
  end
1869
1920
  ```
1870
1921
 
1871
- 環境設定(`RACK_ENV`環境変数)が`:production`に設定されている時だけ実行する方法:
1922
+ 環境設定(`APP_ENV`環境変数)が`:production`に設定されている時だけ実行する方法:
1872
1923
 
1873
1924
  ```ruby
1874
1925
  configure :production do
@@ -1900,18 +1951,19 @@ end
1900
1951
 
1901
1952
  ### 攻撃防御に対する設定
1902
1953
 
1903
- Sinatraは、[Rack::Protection](https://github.com/sinatra/rack-protection#readme)を使って、アプリケーションを多発する日和見的攻撃から守っています。この挙動は簡単に無効化できます(これはアプリケーションを大量の脆弱性攻撃に晒すことになります)。
1954
+ Sinatra[Rack::Protection](https://github.com/sinatra/rack-protection#readme)を使用することで、アプリケーションを一般的な日和見的攻撃から守っています。これは簡単に無効化できます(が、アプリケーションに大量の一般的な脆弱性を埋め込むことになってしまいます)。
1904
1955
 
1905
1956
  ```ruby
1906
1957
  disable :protection
1907
1958
  ```
1908
1959
 
1909
- 単一の防御層を外すためには、`protection`をオプションハッシュにセットします。
1960
+ ある1つの防御を無効にするには、`protection`にハッシュでオプションを指定します。
1910
1961
 
1911
1962
  ```ruby
1912
1963
  set :protection, :except => :path_traversal
1913
1964
  ```
1914
- また配列を渡して、複数の防御を無効にすることもできます。
1965
+
1966
+ 配列を渡すことで、複数の防御を無効にすることもできます。
1915
1967
 
1916
1968
  ```ruby
1917
1969
  set :protection, :except => [:path_traversal, :session_hijacking]
@@ -1958,7 +2010,7 @@ set :protection, :session => true
1958
2010
 
1959
2011
  <dt>environment</dt>
1960
2012
  <dd>
1961
- 現在の環境。デフォルトは<tt>ENV['RACK_ENV']</tt>、それが無い場合は<tt>"development"</tt>。
2013
+ 現在の環境。デフォルトは<tt>ENV['APP_ENV']</tt>、それが無い場合は<tt>"development"</tt>。
1962
2014
  </dd>
1963
2015
 
1964
2016
  <dt>logging</dt>
@@ -2070,12 +2122,12 @@ set :protection, :session => true
2070
2122
 
2071
2123
  ## 環境設定(Environments)
2072
2124
 
2073
- 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"`環境においては、テンプレートはデフォルトでキャッシュされます。
2074
2126
 
2075
- 異なる環境を走らせるには、`RACK_ENV`環境変数を設定します。
2127
+ 異なる環境を走らせるには、`APP_ENV`環境変数を設定します。
2076
2128
 
2077
2129
  ```shell
2078
- RACK_ENV=production ruby my_app.rb
2130
+ APP_ENV=production ruby my_app.rb
2079
2131
  ```
2080
2132
 
2081
2133
  既定メソッド、`development?`、`test?`および`production?`を、現在の環境設定を確認するために使えます。
@@ -2106,7 +2158,14 @@ end
2106
2158
 
2107
2159
  ### エラー(Error)
2108
2160
 
2109
- `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`から取得できます。
2110
2169
 
2111
2170
  ```ruby
2112
2171
  error do
@@ -2158,7 +2217,6 @@ end
2158
2217
 
2159
2218
  Sinatraを開発環境の下で実行している場合は、特別な`not_found`および`error`ハンドラが導入され、これは親切なスタックトレースと追加のデバッギング情報をブラウザに表示します。
2160
2219
 
2161
-
2162
2220
  ## Rackミドルウェア(Rack Middleware)
2163
2221
 
2164
2222
  SinatraはRuby製Webフレームワークのミニマルな標準的インタフェースである[Rack](http://rack.github.io/)上に構築されています。アプリケーションデベロッパーにとってRackにおける最も興味深い機能は、「ミドルウェア(middleware)」をサポートしていることであり、これは、サーバとアプリケーションとの間に置かれ、HTTPリクエスト/レスポンスを監視および/または操作することで、各種の汎用的機能を提供するコンポーネントです。
@@ -2219,7 +2277,7 @@ class MyAppTest < Minitest::Test
2219
2277
  assert_equal 'Hello Frank!', last_response.body
2220
2278
  end
2221
2279
 
2222
- def test_with_rack_env
2280
+ def test_with_user_agent
2223
2281
  get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
2224
2282
  assert_equal "Songbirdを使ってます!", last_response.body
2225
2283
  end
@@ -2245,13 +2303,13 @@ class MyApp < Sinatra::Base
2245
2303
  end
2246
2304
  ```
2247
2305
 
2248
- `Sinatra::Base`のサブクラスで利用できるメソッドは、トップレベルDSLで利用できるものと全く同じです。ほとんどのトップレベルで記述されたアプリは、以下の2点を修正することで`Sinatra::Base`コンポーネントに変えることができます。
2306
+ `Sinatra::Base`のサブクラスで利用できるメソッドは、トップレベルDSLで利用できるものと全く同じです。ほとんどのトップレベルで記述されたアプリは、以下の2点を修正することで`Sinatra::Base`コンポーネントに変えることができます。
2249
2307
 
2250
2308
  * `sinatra`の代わりに`sinatra/base`を読み込む
2251
2309
  (そうしない場合、SinatraのDSLメソッドの全てがmainの名前空間にインポートされます)
2252
2310
  * ルーティング、エラーハンドラ、フィルタ、オプションを`Sinatra::Base`のサブクラスに書く
2253
2311
 
2254
- `Sinatra::Base`はまっさらです。ビルトインサーバを含む、ほとんどのオプションがデフォルトで無効になっています。利用可能なオプションとその挙動の詳細については[Configuring Settings](http://www.sinatrarb.com/configuration.html)(英語)をご覧下さい。
2312
+ `Sinatra::Base`はまっさらです。ビルトインサーバを含む、ほとんどのオプションがデフォルトで無効になっています。利用可能なオプションとその挙動の詳細については[Configuring Settings](http://www.sinatrarb.com/configuration.html)(英語)をご覧ください。
2255
2313
 
2256
2314
  もしもクラシックスタイルと同じような挙動のアプリケーションをトップレベルで定義させる必要があれば、`Sinatra::Application`をサブクラス化させてください。
2257
2315