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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +111 -47
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +41 -49
- data/LICENSE +4 -1
- data/MAINTENANCE.md +42 -0
- data/README.de.md +644 -436
- data/README.es.md +6 -6
- data/README.fr.md +9 -9
- data/README.hu.md +37 -3
- data/README.ja.md +103 -45
- data/README.ko.md +8 -8
- data/README.md +471 -363
- data/README.pt-br.md +3 -3
- data/README.pt-pt.md +2 -2
- data/README.ru.md +42 -64
- data/README.zh.md +8 -8
- data/Rakefile +72 -49
- data/SECURITY.md +35 -0
- data/lib/sinatra/base.rb +137 -195
- data/lib/sinatra/indifferent_hash.rb +150 -0
- data/lib/sinatra/main.rb +1 -0
- data/lib/sinatra/show_exceptions.rb +63 -55
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +19 -7
- metadata +30 -164
- 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.es.md
CHANGED
@@ -117,7 +117,7 @@ end
|
|
117
117
|
Rutas con Expresiones Regulares:
|
118
118
|
|
119
119
|
```ruby
|
120
|
-
get
|
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{
|
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
|
-
|
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
|
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['
|
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 `
|
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
|
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{
|
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
|
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['
|
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 `
|
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 `
|
2240
|
+
variable d'environnement `APP_ENV` :
|
2241
2241
|
|
2242
|
-
```shell
|
2243
|
-
|
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
|
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
|
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
|
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
|
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
|
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{
|
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
|
-
|
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,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
|
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
|
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
|
-
環境設定(`
|
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
|
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
|
-
|
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['
|
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
|
-
|
2125
|
+
3種類の既定環境、`"development"`、`"production"`および`"test"`があります。環境は、`APP_ENV`環境変数を通して設定できます。デフォルト値は、`"development"`です。`"development"`環境において、すべてのテンプレートは、各リクエスト間で再ロードされ、そして、特別の`not_found`および`error`ハンドラがブラウザにスタックトレースを表示します。`"production"`および`"test"`環境においては、テンプレートはデフォルトでキャッシュされます。
|
2074
2126
|
|
2075
|
-
異なる環境を走らせるには、`
|
2127
|
+
異なる環境を走らせるには、`APP_ENV`環境変数を設定します。
|
2076
2128
|
|
2077
2129
|
```shell
|
2078
|
-
|
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
|
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
|
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
|
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
|
|