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