sinatra 1.4.8 → 2.1.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.
- checksums.yaml +5 -5
- data/AUTHORS.md +1 -0
- data/CHANGELOG.md +272 -54
- data/CONTRIBUTING.md +8 -8
- data/Gemfile +48 -47
- data/LICENSE +4 -1
- data/MAINTENANCE.md +42 -0
- data/README.de.md +651 -443
- data/README.es.md +738 -357
- data/README.fr.md +197 -100
- data/README.hu.md +40 -6
- data/README.ja.md +125 -67
- data/README.ko.md +15 -15
- data/README.malayalam.md +3141 -0
- data/README.md +592 -432
- data/README.pt-br.md +2362 -335
- data/README.pt-pt.md +5 -5
- data/README.ru.md +857 -608
- data/README.zh.md +91 -29
- data/Rakefile +77 -51
- data/SECURITY.md +35 -0
- data/VERSION +1 -0
- data/examples/chat.rb +2 -1
- data/examples/rainbows.conf +3 -0
- data/examples/rainbows.rb +20 -0
- data/examples/stream.ru +4 -4
- data/lib/sinatra/base.rb +243 -265
- data/lib/sinatra/indifferent_hash.rb +200 -0
- data/lib/sinatra/main.rb +30 -10
- data/lib/sinatra/show_exceptions.rb +67 -62
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +44 -8
- metadata +43 -167
- data/lib/sinatra/ext.rb +0 -17
- data/test/asciidoctor_test.rb +0 -72
- data/test/base_test.rb +0 -167
- data/test/builder_test.rb +0 -91
- data/test/coffee_test.rb +0 -96
- data/test/compile_test.rb +0 -183
- data/test/contest.rb +0 -91
- data/test/creole_test.rb +0 -65
- data/test/delegator_test.rb +0 -160
- data/test/encoding_test.rb +0 -20
- data/test/erb_test.rb +0 -116
- data/test/extensions_test.rb +0 -98
- data/test/filter_test.rb +0 -487
- data/test/haml_test.rb +0 -109
- data/test/helper.rb +0 -132
- data/test/helpers_test.rb +0 -1917
- data/test/integration/app.rb +0 -79
- data/test/integration_helper.rb +0 -236
- data/test/integration_test.rb +0 -104
- data/test/less_test.rb +0 -69
- data/test/liquid_test.rb +0 -77
- data/test/mapped_error_test.rb +0 -285
- data/test/markaby_test.rb +0 -80
- data/test/markdown_test.rb +0 -85
- data/test/mediawiki_test.rb +0 -68
- data/test/middleware_test.rb +0 -68
- data/test/nokogiri_test.rb +0 -67
- data/test/public/favicon.ico +0 -0
- data/test/public/hello+world.txt +0 -1
- data/test/rabl_test.rb +0 -89
- data/test/rack_test.rb +0 -45
- data/test/radius_test.rb +0 -59
- data/test/rdoc_test.rb +0 -66
- data/test/readme_test.rb +0 -130
- data/test/request_test.rb +0 -100
- data/test/response_test.rb +0 -63
- data/test/result_test.rb +0 -76
- data/test/route_added_hook_test.rb +0 -59
- data/test/routing_test.rb +0 -1456
- data/test/sass_test.rb +0 -115
- data/test/scss_test.rb +0 -88
- data/test/server_test.rb +0 -56
- data/test/settings_test.rb +0 -582
- data/test/sinatra_test.rb +0 -12
- data/test/slim_test.rb +0 -102
- data/test/static_test.rb +0 -266
- data/test/streaming_test.rb +0 -149
- data/test/stylus_test.rb +0 -90
- data/test/templates_test.rb +0 -382
- data/test/textile_test.rb +0 -65
- data/test/views/a/in_a.str +0 -1
- data/test/views/ascii.erb +0 -2
- data/test/views/b/in_b.str +0 -1
- data/test/views/calc.html.erb +0 -1
- data/test/views/error.builder +0 -3
- data/test/views/error.erb +0 -3
- data/test/views/error.haml +0 -3
- data/test/views/error.sass +0 -2
- data/test/views/explicitly_nested.str +0 -1
- data/test/views/foo/hello.test +0 -1
- data/test/views/hello.asciidoc +0 -1
- data/test/views/hello.builder +0 -1
- data/test/views/hello.coffee +0 -1
- data/test/views/hello.creole +0 -1
- data/test/views/hello.erb +0 -1
- data/test/views/hello.haml +0 -1
- data/test/views/hello.less +0 -5
- data/test/views/hello.liquid +0 -1
- data/test/views/hello.mab +0 -1
- data/test/views/hello.md +0 -1
- data/test/views/hello.mediawiki +0 -1
- data/test/views/hello.nokogiri +0 -1
- data/test/views/hello.rabl +0 -2
- data/test/views/hello.radius +0 -1
- data/test/views/hello.rdoc +0 -1
- data/test/views/hello.sass +0 -2
- data/test/views/hello.scss +0 -3
- data/test/views/hello.slim +0 -1
- data/test/views/hello.str +0 -1
- data/test/views/hello.styl +0 -2
- data/test/views/hello.test +0 -1
- data/test/views/hello.textile +0 -1
- data/test/views/hello.wlang +0 -1
- data/test/views/hello.yajl +0 -1
- data/test/views/layout2.builder +0 -3
- data/test/views/layout2.erb +0 -2
- data/test/views/layout2.haml +0 -2
- data/test/views/layout2.liquid +0 -2
- data/test/views/layout2.mab +0 -2
- data/test/views/layout2.nokogiri +0 -3
- data/test/views/layout2.rabl +0 -3
- data/test/views/layout2.radius +0 -2
- data/test/views/layout2.slim +0 -3
- data/test/views/layout2.str +0 -2
- data/test/views/layout2.test +0 -1
- data/test/views/layout2.wlang +0 -2
- data/test/views/nested.str +0 -1
- data/test/views/utf8.erb +0 -2
- data/test/wlang_test.rb +0 -87
- 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
|
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
|
-
`[ステータス(
|
318
|
+
`[ステータス(Integer), ヘッダ(Hash), レスポンスボディ(#eachに応答する)]`
|
309
319
|
* 2つの要素を含む配列:
|
310
|
-
`[ステータス(
|
320
|
+
`[ステータス(Integer), レスポンスボディ(#eachに応答する)]`
|
311
321
|
* `#each`に応答するオブジェクト。通常はそのまま何も返さないが、
|
312
322
|
与えられたブロックに文字列を渡す。
|
313
|
-
* ステータスコードを表現する整数(
|
323
|
+
* ステータスコードを表現する整数(Integer)
|
314
324
|
|
315
325
|
これにより、例えばストリーミングを簡単に実装することができます。
|
316
326
|
|
@@ -365,19 +375,18 @@ end
|
|
365
375
|
または、否定先読みを使って:
|
366
376
|
|
367
377
|
```ruby
|
368
|
-
get %r{
|
378
|
+
get %r{(?!/index)} do
|
369
379
|
# ...
|
370
380
|
end
|
371
381
|
```
|
372
382
|
|
373
|
-
|
374
383
|
## 静的ファイル(Static Files)
|
375
384
|
|
376
385
|
静的ファイルは`./public`ディレクトリから配信されます。
|
377
386
|
`:public_folder`オプションを指定することで別の場所を指定することができます。
|
378
387
|
|
379
388
|
```ruby
|
380
|
-
set :public_folder,
|
389
|
+
set :public_folder, __dir__ + '/static'
|
381
390
|
```
|
382
391
|
|
383
392
|
ノート: この静的ファイル用のディレクトリ名はURL中に含まれません。
|
@@ -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
|
-
|
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
|
-
|
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="
|
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>
|
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="
|
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="
|
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="
|
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="
|
677
|
-
<a href="
|
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="
|
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="
|
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
|
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
|
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;
|
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 '
|
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
|
-
環境設定(`
|
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
|
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
|
-
|
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['
|
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
|
-
|
2126
|
+
3種類の既定環境、`"development"`、`"production"`および`"test"`があります。環境は、`APP_ENV`環境変数を通して設定できます。デフォルト値は、`"development"`です。`"development"`環境において、すべてのテンプレートは、各リクエスト間で再ロードされ、そして、特別の`not_found`および`error`ハンドラがブラウザにスタックトレースを表示します。`"production"`および`"test"`環境においては、テンプレートはデフォルトでキャッシュされます。
|
2074
2127
|
|
2075
|
-
異なる環境を走らせるには、`
|
2128
|
+
異なる環境を走らせるには、`APP_ENV`環境変数を設定します。
|
2076
2129
|
|
2077
2130
|
```shell
|
2078
|
-
|
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
|
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](
|
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
|
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
|
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]
|
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](
|
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](
|
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
|
-
* [メーリングリスト](
|
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/) コミュニティによるレシピ集
|