sinatra 1.4.6 → 1.4.7
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} +17 -1
- data/CONTRIBUTING.md +100 -0
- data/LICENSE +2 -2
- data/README.de.md +78 -41
- data/README.es.md +200 -165
- data/README.fr.md +364 -338
- data/README.hu.md +7 -7
- data/README.ja.md +199 -167
- data/README.ko.md +222 -183
- data/README.md +218 -179
- data/README.pt-br.md +146 -112
- data/README.pt-pt.md +63 -63
- data/README.ru.md +158 -35
- data/README.zh.md +1941 -1235
- data/Rakefile +2 -2
- data/lib/sinatra/base.rb +16 -24
- data/lib/sinatra/ext.rb +17 -0
- data/lib/sinatra/show_exceptions.rb +13 -7
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +1 -1
- data/test/public/hello+world.txt +1 -0
- data/test/routing_test.rb +44 -0
- data/test/static_test.rb +30 -0
- metadata +9 -6
data/README.hu.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
*Fontos megjegyzés: Ez a dokumentum csak egy fordítása az angol nyelvű
|
3
3
|
változatnak, és lehet, hogy nem naprakész.*
|
4
4
|
|
5
|
-
A Sinatra egy [DSL](
|
5
|
+
A Sinatra egy [DSL](https://en.wikipedia.org/wiki/Domain-specific_language)
|
6
6
|
webalkalmazások Ruby nyelven történő fejlesztéséhez, minimális
|
7
7
|
energiabefektetéssel:
|
8
8
|
|
@@ -21,7 +21,7 @@ Telepítsd a gem-et és indítsd el az alkalmazást a következőképpen:
|
|
21
21
|
ruby myapp.rb
|
22
22
|
```
|
23
23
|
|
24
|
-
Az alkalmazás elérhető lesz itt:
|
24
|
+
Az alkalmazás elérhető lesz itt: [http://localhost:4567](http://localhost:4567)
|
25
25
|
|
26
26
|
## Útvonalak (routes)
|
27
27
|
|
@@ -518,7 +518,7 @@ A Sinatra keretrendszerben gyerekjáték a Rack middleware-ek behúzása a
|
|
518
518
|
```
|
519
519
|
|
520
520
|
A `use` metódus szemantikája megegyezik a
|
521
|
-
[Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder) DSL-ben
|
521
|
+
[Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder) DSL-ben
|
522
522
|
használt +use+ metóduséval (az említett DSL-t leginkább rackup állományokban
|
523
523
|
használják). Hogy egy példát említsünk, a `use` metódus elfogad
|
524
524
|
változókat és blokkokat egyaránt, akár kombinálva is ezeket:
|
@@ -621,7 +621,7 @@ alkalmazás átalakítható Sinatra::Base alapú komponensekké két lépésben:
|
|
621
621
|
A `Sinatra::Base` osztály igazából egy üres lap: a legtöbb funkció
|
622
622
|
alapból ki van kapcsolva, beleértve a beépített szervert is. A
|
623
623
|
beállításokkal és az egyes kapcsolók hatásával az
|
624
|
-
[Options and Configuration](http://
|
624
|
+
[Options and Configuration](http://www.sinatrarb.com/configuration.html) lap
|
625
625
|
foglalkozik.
|
626
626
|
|
627
627
|
Széljegyzet: A Sinatra felső szintű DSL-je egy egyszerű delegációs
|
@@ -684,11 +684,11 @@ A Sinatra frissítését később így végezheted el:
|
|
684
684
|
|
685
685
|
## További információk
|
686
686
|
|
687
|
-
* [A projekt weboldala](http://
|
687
|
+
* [A projekt weboldala](http://www.sinatrarb.com/) - Kiegészítő dokumentáció,
|
688
688
|
hírek, hasznos linkek
|
689
|
-
* [Közreműködés](http://
|
689
|
+
* [Közreműködés](http://www.sinatrarb.com/contributing.html) - Hibát találtál?
|
690
690
|
Segítségre van szükséged? Foltot küldenél be?
|
691
691
|
* [Lighthouse](http://sinatra.lighthouseapp.com) - Hibakövetés és kiadások
|
692
|
-
* [Twitter](
|
692
|
+
* [Twitter](https://twitter.com/sinatra)
|
693
693
|
* [Levelezőlista](http://groups.google.com/group/sinatrarb)
|
694
694
|
* [IRC: #sinatra](irc://chat.freenode.net/#sinatra) a http://freenode.net címen
|
data/README.ja.md
CHANGED
@@ -3,9 +3,9 @@
|
|
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
|
|
@@ -109,6 +109,7 @@ ThinがあればSinatraはこれを利用するので、`gem install thin`する
|
|
109
109
|
* [リクエスト/インスタンスのスコープ](#リクエストインスタンスのスコープ)
|
110
110
|
* [デリゲートスコープ](#デリゲートスコープ)
|
111
111
|
* [コマンドライン](#コマンドライン)
|
112
|
+
* [マルチスレッド](#マルチスレッド)
|
112
113
|
* [必要環境](#必要環境)
|
113
114
|
* [最新開発版](#最新開発版)
|
114
115
|
* [Bundlerを使う場合](#bundlerを使う場合)
|
@@ -122,7 +123,7 @@ ThinがあればSinatraはこれを利用するので、`gem install thin`する
|
|
122
123
|
Sinatraでは、ルーティングはHTTPメソッドとURLマッチングパターンがペアになっています。
|
123
124
|
ルーティングはブロックに結び付けられています。
|
124
125
|
|
125
|
-
```
|
126
|
+
```ruby
|
126
127
|
get '/' do
|
127
128
|
.. 何か見せる ..
|
128
129
|
end
|
@@ -162,7 +163,7 @@ end
|
|
162
163
|
ルーティングのパターンは名前付きパラメータを含むことができ、
|
163
164
|
`params`ハッシュで取得できます。
|
164
165
|
|
165
|
-
```
|
166
|
+
```ruby
|
166
167
|
get '/hello/:name' do
|
167
168
|
# "GET /hello/foo" と "GET /hello/bar" にマッチ
|
168
169
|
# params['name'] は 'foo' か 'bar'
|
@@ -172,7 +173,7 @@ end
|
|
172
173
|
|
173
174
|
また、ブロックパラメータで名前付きパラメータにアクセスすることもできます。
|
174
175
|
|
175
|
-
```
|
176
|
+
```ruby
|
176
177
|
get '/hello/:name' do |n|
|
177
178
|
# "GET /hello/foo" と "GET /hello/bar" にマッチ
|
178
179
|
# params['name'] は 'foo' か 'bar'
|
@@ -184,7 +185,7 @@ end
|
|
184
185
|
ルーティングパターンはアスタリスク(すなわちワイルドカード)を含むこともでき、
|
185
186
|
`params['splat']` で取得できます。
|
186
187
|
|
187
|
-
```
|
188
|
+
```ruby
|
188
189
|
get '/say/*/to/*' do
|
189
190
|
# /say/hello/to/world にマッチ
|
190
191
|
params['splat'] # => ["hello", "world"]
|
@@ -198,7 +199,7 @@ end
|
|
198
199
|
|
199
200
|
ここで、ブロックパラメータを使うこともできます。
|
200
201
|
|
201
|
-
```
|
202
|
+
```ruby
|
202
203
|
get '/download/*.*' do |path, ext|
|
203
204
|
[path, ext] # => ["path/to/file", "xml"]
|
204
205
|
end
|
@@ -206,7 +207,7 @@ end
|
|
206
207
|
|
207
208
|
ルーティングを正規表現にマッチさせることもできます。
|
208
209
|
|
209
|
-
```
|
210
|
+
```ruby
|
210
211
|
get /\A\/hello\/([\w]+)\z/ do
|
211
212
|
"Hello, #{params['captures'].first}!"
|
212
213
|
end
|
@@ -214,7 +215,7 @@ end
|
|
214
215
|
|
215
216
|
ここでも、ブロックパラメータが使えます。
|
216
217
|
|
217
|
-
```
|
218
|
+
```ruby
|
218
219
|
get %r{/hello/([\w]+)} do |c|
|
219
220
|
"Hello, #{c}!"
|
220
221
|
end
|
@@ -222,9 +223,9 @@ end
|
|
222
223
|
|
223
224
|
ルーティングパターンは、オプショナルパラメータを取ることもできます。
|
224
225
|
|
225
|
-
```
|
226
|
-
get '/posts
|
227
|
-
# "GET /posts" と "GET /posts
|
226
|
+
```ruby
|
227
|
+
get '/posts/:format?' do
|
228
|
+
# "GET /posts/" と "GET /posts/json", "GET /posts/xml" の拡張子などにマッチ
|
228
229
|
end
|
229
230
|
```
|
230
231
|
|
@@ -235,7 +236,7 @@ end
|
|
235
236
|
|
236
237
|
ルーティングにはユーザエージェントのようなさまざまな条件を含めることができます。
|
237
238
|
|
238
|
-
```
|
239
|
+
```ruby
|
239
240
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
240
241
|
"Songbirdのバージョン #{params['agent'][0]}を使ってます。"
|
241
242
|
end
|
@@ -247,7 +248,7 @@ end
|
|
247
248
|
|
248
249
|
ほかに`host_name`と`provides`条件が利用可能です。
|
249
250
|
|
250
|
-
```
|
251
|
+
```ruby
|
251
252
|
get '/', :host_name => /^admin\./ do
|
252
253
|
"Adminエリアです。アクセスを拒否します!"
|
253
254
|
end
|
@@ -263,7 +264,7 @@ end
|
|
263
264
|
|
264
265
|
独自の条件を定義することも簡単にできます。
|
265
266
|
|
266
|
-
```
|
267
|
+
```ruby
|
267
268
|
set(:probability) { |value| condition { rand <= value } }
|
268
269
|
|
269
270
|
get '/win_a_car', :probability => 0.1 do
|
@@ -277,7 +278,7 @@ end
|
|
277
278
|
|
278
279
|
複数の値を取る条件には、アスタリスクを使います。
|
279
280
|
|
280
|
-
```
|
281
|
+
```ruby
|
281
282
|
set(:auth) do |*roles| # <- ここでアスタリスクを使う
|
282
283
|
condition do
|
283
284
|
unless logged_in? && roles.any? {|role| current_user.in_role? role }
|
@@ -313,7 +314,7 @@ Rackレスポンス、Rackボディオブジェクト、HTTPステータスコ
|
|
313
314
|
|
314
315
|
これにより、例えばストリーミングを簡単に実装することができます。
|
315
316
|
|
316
|
-
```
|
317
|
+
```ruby
|
317
318
|
class Stream
|
318
319
|
def each
|
319
320
|
100.times { |i| yield "#{i}\n" }
|
@@ -329,7 +330,7 @@ get('/') { Stream.new }
|
|
329
330
|
|
330
331
|
先述のようにSinatraはルーティングマッチャーとして、文字列パターンと正規表現を使うことをビルトインでサポートしています。しかしこれに留まらず、独自のマッチャーを簡単に定義することもできるのです。
|
331
332
|
|
332
|
-
```
|
333
|
+
```ruby
|
333
334
|
class AllButPattern
|
334
335
|
Match = Struct.new(:captures)
|
335
336
|
|
@@ -354,7 +355,7 @@ end
|
|
354
355
|
|
355
356
|
ノート: この例はオーバースペックであり、以下のようにも書くことができます。
|
356
357
|
|
357
|
-
```
|
358
|
+
```ruby
|
358
359
|
get // do
|
359
360
|
pass if request.path_info == "/index"
|
360
361
|
# ...
|
@@ -363,7 +364,7 @@ end
|
|
363
364
|
|
364
365
|
または、否定先読みを使って:
|
365
366
|
|
366
|
-
```
|
367
|
+
```ruby
|
367
368
|
get %r{^(?!/index$)} do
|
368
369
|
# ...
|
369
370
|
end
|
@@ -375,7 +376,7 @@ end
|
|
375
376
|
静的ファイルは`./public`ディレクトリから配信されます。
|
376
377
|
`:public_folder`オプションを指定することで別の場所を指定することができます。
|
377
378
|
|
378
|
-
```
|
379
|
+
```ruby
|
379
380
|
set :public_folder, File.dirname(__FILE__) + '/static'
|
380
381
|
```
|
381
382
|
|
@@ -388,7 +389,7 @@ set :public_folder, File.dirname(__FILE__) + '/static'
|
|
388
389
|
|
389
390
|
各テンプレート言語はそれ自身のレンダリングメソッドを通して展開されます。それらのメソッドは単に文字列を返します。
|
390
391
|
|
391
|
-
```
|
392
|
+
```ruby
|
392
393
|
get '/' do
|
393
394
|
erb :index
|
394
395
|
end
|
@@ -398,7 +399,7 @@ end
|
|
398
399
|
|
399
400
|
テンプレート名を渡す代わりに、直接そのテンプレートの中身を渡すこともできます。
|
400
401
|
|
401
|
-
```
|
402
|
+
```ruby
|
402
403
|
get '/' do
|
403
404
|
code = "<%= Time.now %>"
|
404
405
|
erb code
|
@@ -407,7 +408,7 @@ end
|
|
407
408
|
|
408
409
|
テンプレートのレイアウトは第2引数のハッシュ形式のオプションをもとに表示されます。
|
409
410
|
|
410
|
-
```
|
411
|
+
```ruby
|
411
412
|
get '/' do
|
412
413
|
erb :index, :layout => :post
|
413
414
|
end
|
@@ -418,7 +419,7 @@ end
|
|
418
419
|
Sinatraが理解できないオプションは、テンプレートエンジンに渡されることになります。
|
419
420
|
|
420
421
|
|
421
|
-
```
|
422
|
+
```ruby
|
422
423
|
get '/' do
|
423
424
|
haml :index, :format => :html5
|
424
425
|
end
|
@@ -426,7 +427,7 @@ end
|
|
426
427
|
|
427
428
|
テンプレート言語ごとにオプションをセットすることもできます。
|
428
429
|
|
429
|
-
```
|
430
|
+
```ruby
|
430
431
|
set :haml, :format => :html5
|
431
432
|
|
432
433
|
get '/' do
|
@@ -485,7 +486,7 @@ end
|
|
485
486
|
テンプレートは`./views`ディレクトリ下に配置されています。
|
486
487
|
他のディレクトリを使用する場合の例:
|
487
488
|
|
488
|
-
```
|
489
|
+
```ruby
|
489
490
|
set :views, settings.root + '/templates'
|
490
491
|
```
|
491
492
|
|
@@ -495,7 +496,7 @@ set :views, settings.root + '/templates'
|
|
495
496
|
|
496
497
|
### リテラルテンプレート(Literal Templates)
|
497
498
|
|
498
|
-
```
|
499
|
+
```ruby
|
499
500
|
get '/' do
|
500
501
|
haml '%div.title Hello World'
|
501
502
|
end
|
@@ -508,7 +509,7 @@ end
|
|
508
509
|
いくつかの言語には複数の実装があります。使用する(そしてスレッドセーフにする)実装を指定するには、それを最初にrequireしてください。
|
509
510
|
|
510
511
|
|
511
|
-
```
|
512
|
+
```ruby
|
512
513
|
require 'rdiscount' # または require 'bluecloth'
|
513
514
|
get('/') { markdown :index }
|
514
515
|
```
|
@@ -577,7 +578,7 @@ get('/') { markdown :index }
|
|
577
578
|
<table>
|
578
579
|
<tr>
|
579
580
|
<td>依存</td>
|
580
|
-
<td><a href="http://nokogiri.org/" title="nokogiri">nokogiri</a></td>
|
581
|
+
<td><a href="http://www.nokogiri.org/" title="nokogiri">nokogiri</a></td>
|
581
582
|
</tr>
|
582
583
|
<tr>
|
583
584
|
<td>ファイル拡張子</td>
|
@@ -632,7 +633,7 @@ get('/') { markdown :index }
|
|
632
633
|
<table>
|
633
634
|
<tr>
|
634
635
|
<td>依存</td>
|
635
|
-
<td><a href="http://
|
636
|
+
<td><a href="http://lesscss.org/" title="less">less</a></td>
|
636
637
|
</tr>
|
637
638
|
<tr>
|
638
639
|
<td>ファイル拡張子</td>
|
@@ -649,7 +650,7 @@ get('/') { markdown :index }
|
|
649
650
|
<table>
|
650
651
|
<tr>
|
651
652
|
<td>依存</td>
|
652
|
-
<td><a href="http://
|
653
|
+
<td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
|
653
654
|
</tr>
|
654
655
|
<tr>
|
655
656
|
<td>ファイル拡張子</td>
|
@@ -670,7 +671,7 @@ LiquidテンプレートからRubyのメソッド(`yield`を除く)を呼び出
|
|
670
671
|
<td>依存</td>
|
671
672
|
<td>
|
672
673
|
次の何れか:
|
673
|
-
<a href="https://github.com/
|
674
|
+
<a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
|
674
675
|
<a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
|
675
676
|
<a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
|
676
677
|
<a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
|
@@ -690,13 +691,13 @@ LiquidテンプレートからRubyのメソッド(`yield`を除く)を呼び出
|
|
690
691
|
Markdownからメソッドを呼び出すことも、localsに変数を渡すこともできません。
|
691
692
|
それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です。
|
692
693
|
|
693
|
-
```
|
694
|
+
```ruby
|
694
695
|
erb :overview, :locals => { :text => markdown(:introduction) }
|
695
696
|
```
|
696
697
|
|
697
698
|
ノート: 他のテンプレート内で`markdown`メソッドを呼び出せます。
|
698
699
|
|
699
|
-
```
|
700
|
+
```ruby
|
700
701
|
%h1 Hello From Haml!
|
701
702
|
%p= markdown(:greetings)
|
702
703
|
```
|
@@ -724,13 +725,13 @@ MarkdownからはRubyを呼ぶことができないので、Markdownで書かれ
|
|
724
725
|
Textileからメソッドを呼び出すことも、localsに変数を渡すこともできません。
|
725
726
|
それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です。
|
726
727
|
|
727
|
-
```
|
728
|
+
```ruby
|
728
729
|
erb :overview, :locals => { :text => textile(:introduction) }
|
729
730
|
```
|
730
731
|
|
731
732
|
ノート: 他のテンプレート内で`textile`メソッドを呼び出せます。
|
732
733
|
|
733
|
-
```
|
734
|
+
```ruby
|
734
735
|
%h1 Hello From Haml!
|
735
736
|
%p= textile(:greetings)
|
736
737
|
```
|
@@ -757,14 +758,14 @@ TexttileからはRubyを呼ぶことができないので、Textileで書かれ
|
|
757
758
|
RDocからメソッドを呼び出すことも、localsに変数を渡すこともできません。
|
758
759
|
それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です。
|
759
760
|
|
760
|
-
```
|
761
|
+
```ruby
|
761
762
|
erb :overview, :locals => { :text => rdoc(:introduction) }
|
762
763
|
```
|
763
764
|
|
764
765
|
ノート: 他のテンプレート内で`rdoc`メソッドを呼び出せます。
|
765
766
|
|
766
767
|
|
767
|
-
```
|
768
|
+
```ruby
|
768
769
|
%h1 Hello From Haml!
|
769
770
|
%p= rdoc(:greetings)
|
770
771
|
```
|
@@ -815,7 +816,7 @@ RadiusテンプレートからRubyのメソッドを直接呼び出すことが
|
|
815
816
|
<table>
|
816
817
|
<tr>
|
817
818
|
<td>依存</td>
|
818
|
-
<td><a href="http://markaby.github.
|
819
|
+
<td><a href="http://markaby.github.io/" title="Markaby">Markaby</a></td>
|
819
820
|
</tr>
|
820
821
|
<tr>
|
821
822
|
<td>ファイル拡張子</td>
|
@@ -883,13 +884,13 @@ RadiusテンプレートからRubyのメソッドを直接呼び出すことが
|
|
883
884
|
Creoleからメソッドを呼び出すことも、localsに変数を渡すこともできません。
|
884
885
|
それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です。
|
885
886
|
|
886
|
-
```
|
887
|
+
```ruby
|
887
888
|
erb :overview, :locals => { :text => creole(:introduction) }
|
888
889
|
```
|
889
890
|
|
890
891
|
ノート: 他のテンプレート内で`creole`メソッドを呼び出せます。
|
891
892
|
|
892
|
-
```
|
893
|
+
```ruby
|
893
894
|
%h1 Hello From Haml!
|
894
895
|
%p= creole(:greetings)
|
895
896
|
```
|
@@ -951,7 +952,7 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
|
|
951
952
|
<tr>
|
952
953
|
<td>依存</td>
|
953
954
|
<td>
|
954
|
-
<a href="https://github.com/
|
955
|
+
<a href="https://github.com/forgecrafted/ruby-stylus" title="Ruby Stylus">
|
955
956
|
Stylus
|
956
957
|
</a> および
|
957
958
|
<a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
|
@@ -971,7 +972,7 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
|
|
971
972
|
|
972
973
|
Stylusテンプレートを使えるようにする前に、まず`stylus`と`stylus/tilt`を読み込む必要があります。
|
973
974
|
|
974
|
-
```
|
975
|
+
```ruby
|
975
976
|
require 'sinatra'
|
976
977
|
require 'stylus'
|
977
978
|
require 'stylus/tilt'
|
@@ -1008,14 +1009,14 @@ end
|
|
1008
1009
|
|
1009
1010
|
テンプレートのソースはRubyの文字列として評価され、その結果のJSON変数は`#to_json`を使って変換されます。
|
1010
1011
|
|
1011
|
-
```
|
1012
|
+
```ruby
|
1012
1013
|
json = { :foo => 'bar' }
|
1013
1014
|
json[:baz] = key
|
1014
1015
|
```
|
1015
1016
|
|
1016
1017
|
`:callback`および`:variable`オプションは、レンダリングされたオブジェクトを装飾するために使うことができます。
|
1017
1018
|
|
1018
|
-
```
|
1019
|
+
```ruby
|
1019
1020
|
var resource = {"foo":"bar","baz":"qux"}; present(resource);
|
1020
1021
|
```
|
1021
1022
|
|
@@ -1042,7 +1043,7 @@ WLang内でのRubyメソッドの呼び出しは一般的ではないので、
|
|
1042
1043
|
|
1043
1044
|
テンプレートはルーティングハンドラと同じコンテキストの中で評価されます。ルーティングハンドラでセットされたインスタンス変数はテンプレート内で直接使うことができます。
|
1044
1045
|
|
1045
|
-
```
|
1046
|
+
```ruby
|
1046
1047
|
get '/:id' do
|
1047
1048
|
@foo = Foo.find(params['id'])
|
1048
1049
|
haml '%h1= @foo.name'
|
@@ -1051,7 +1052,7 @@ end
|
|
1051
1052
|
|
1052
1053
|
また、ローカル変数のハッシュで明示的に指定することもできます。
|
1053
1054
|
|
1054
|
-
```
|
1055
|
+
```ruby
|
1055
1056
|
get '/:id' do
|
1056
1057
|
foo = Foo.find(params['id'])
|
1057
1058
|
haml '%h1= bar.name', :locals => { :bar => foo }
|
@@ -1065,7 +1066,7 @@ end
|
|
1065
1066
|
レイアウトは通常、`yield`を呼ぶ単なるテンプレートに過ぎません。
|
1066
1067
|
そのようなテンプレートは、既に説明した`:template`オプションを通して使われるか、または次のようなブロックを伴ってレンダリングされます。
|
1067
1068
|
|
1068
|
-
```
|
1069
|
+
```ruby
|
1069
1070
|
erb :post, :layout => false do
|
1070
1071
|
erb :index
|
1071
1072
|
end
|
@@ -1075,7 +1076,7 @@ end
|
|
1075
1076
|
|
1076
1077
|
レンダリングメソッドにブロックを渡すスタイルは、ネストしたレイアウトを作るために最も役立ちます。
|
1077
1078
|
|
1078
|
-
```
|
1079
|
+
```ruby
|
1079
1080
|
erb :main_layout, :layout => false do
|
1080
1081
|
erb :admin_layout do
|
1081
1082
|
erb :user
|
@@ -1085,7 +1086,7 @@ end
|
|
1085
1086
|
|
1086
1087
|
これはまた次のより短いコードでも達成できます。
|
1087
1088
|
|
1088
|
-
```
|
1089
|
+
```ruby
|
1089
1090
|
erb :admin_layout, :layout => :main_layout do
|
1090
1091
|
erb :user
|
1091
1092
|
end
|
@@ -1100,7 +1101,7 @@ end
|
|
1100
1101
|
|
1101
1102
|
テンプレートはソースファイルの最後で定義することもできます。
|
1102
1103
|
|
1103
|
-
```
|
1104
|
+
```ruby
|
1104
1105
|
require 'sinatra'
|
1105
1106
|
|
1106
1107
|
get '/' do
|
@@ -1123,7 +1124,7 @@ __END__
|
|
1123
1124
|
|
1124
1125
|
テンプレートはトップレベルの`template`メソッドで定義することもできます。
|
1125
1126
|
|
1126
|
-
```
|
1127
|
+
```ruby
|
1127
1128
|
template :layout do
|
1128
1129
|
"%html\n =yield\n"
|
1129
1130
|
end
|
@@ -1139,7 +1140,7 @@ end
|
|
1139
1140
|
|
1140
1141
|
「layout」というテンプレートが存在する場合、そのテンプレートファイルは他のテンプレートがレンダリングされる度に使用されます。`:layout => false`で個別に、または`set :haml, :layout => false`でデフォルトとして、レイアウトを無効にすることができます。
|
1141
1142
|
|
1142
|
-
```
|
1143
|
+
```ruby
|
1143
1144
|
get '/' do
|
1144
1145
|
haml :index, :layout => !request.xhr?
|
1145
1146
|
end
|
@@ -1149,7 +1150,7 @@ end
|
|
1149
1150
|
|
1150
1151
|
任意のテンプレートエンジンにファイル拡張子を関連付ける場合は、`Tilt.register`を使います。例えば、Textileテンプレートに`tt`というファイル拡張子を使いたい場合は、以下のようにします。
|
1151
1152
|
|
1152
|
-
```
|
1153
|
+
```ruby
|
1153
1154
|
Tilt.register :tt, Tilt[:textile]
|
1154
1155
|
```
|
1155
1156
|
|
@@ -1157,7 +1158,7 @@ Tilt.register :tt, Tilt[:textile]
|
|
1157
1158
|
|
1158
1159
|
まず、Tiltでそのエンジンを登録し、次にレンダリングメソッドを作ります。
|
1159
1160
|
|
1160
|
-
```
|
1161
|
+
```ruby
|
1161
1162
|
Tilt.register :myat, MyAwesomeTemplateEngine
|
1162
1163
|
|
1163
1164
|
helpers do
|
@@ -1175,7 +1176,7 @@ end
|
|
1175
1176
|
|
1176
1177
|
beforeフィルタは、リクエストのルーティングと同じコンテキストで各リクエストの前に評価され、それによってリクエストとレスポンスを変更可能にします。フィルタ内でセットされたインスタンス変数はルーティングとテンプレートからアクセスすることができます。
|
1177
1178
|
|
1178
|
-
```
|
1179
|
+
```ruby
|
1179
1180
|
before do
|
1180
1181
|
@note = 'Hi!'
|
1181
1182
|
request.path_info = '/foo/bar/baz'
|
@@ -1189,7 +1190,7 @@ end
|
|
1189
1190
|
|
1190
1191
|
afterフィルタは、リクエストのルーティングと同じコンテキストで各リクエストの後に評価され、それによってこれもリクエストとレスポンスを変更可能にします。beforeフィルタとルーティング内でセットされたインスタンス変数はafterフィルタからアクセスすることができます。
|
1191
1192
|
|
1192
|
-
```
|
1193
|
+
```ruby
|
1193
1194
|
after do
|
1194
1195
|
puts response.status
|
1195
1196
|
end
|
@@ -1199,7 +1200,7 @@ end
|
|
1199
1200
|
|
1200
1201
|
フィルタにはオプションとしてパターンを渡すことができ、この場合はリクエストのパスがパターンにマッチした場合にのみフィルタが評価されるようになります。
|
1201
1202
|
|
1202
|
-
```
|
1203
|
+
```ruby
|
1203
1204
|
before '/protected/*' do
|
1204
1205
|
authenticate!
|
1205
1206
|
end
|
@@ -1211,7 +1212,7 @@ end
|
|
1211
1212
|
|
1212
1213
|
ルーティング同様、フィルタもまた条件を取ることができます。
|
1213
1214
|
|
1214
|
-
```
|
1215
|
+
```ruby
|
1215
1216
|
before :agent => /Songbird/ do
|
1216
1217
|
# ...
|
1217
1218
|
end
|
@@ -1225,7 +1226,7 @@ end
|
|
1225
1226
|
|
1226
1227
|
トップレベルの`helpers`メソッドを使用してルーティングハンドラやテンプレートで使うヘルパーメソッドを定義できます。
|
1227
1228
|
|
1228
|
-
```
|
1229
|
+
```ruby
|
1229
1230
|
helpers do
|
1230
1231
|
def bar(name)
|
1231
1232
|
"#{name}bar"
|
@@ -1239,7 +1240,7 @@ end
|
|
1239
1240
|
|
1240
1241
|
あるいは、ヘルパーメソッドをモジュール内で個別に定義することもできます。
|
1241
1242
|
|
1242
|
-
```
|
1243
|
+
```ruby
|
1243
1244
|
module FooUtils
|
1244
1245
|
def foo(name) "#{name}foo" end
|
1245
1246
|
end
|
@@ -1258,7 +1259,7 @@ helpers FooUtils, BarUtils
|
|
1258
1259
|
|
1259
1260
|
セッションはリクエスト間での状態維持のために使用されます。その起動により、ユーザセッションごとに一つのセッションハッシュが与えられます。
|
1260
1261
|
|
1261
|
-
```
|
1262
|
+
```ruby
|
1262
1263
|
enable :sessions
|
1263
1264
|
|
1264
1265
|
get '/' do
|
@@ -1272,7 +1273,7 @@ end
|
|
1272
1273
|
|
1273
1274
|
ノート: `enable :sessions`は実際にはすべてのデータをクッキーに保持します。これは必ずしも期待通りのものにならないかもしれません(例えば、大量のデータを保持することでトラフィックが増大するなど)。Rackセッションミドルウェアの利用が可能であり、その場合は`enable :sessions`を呼ばずに、選択したミドルウェアを他のミドルウェアのときと同じようにして取り込んでください。
|
1274
1275
|
|
1275
|
-
```
|
1276
|
+
```ruby
|
1276
1277
|
use Rack::Session::Pool, :expire_after => 2592000
|
1277
1278
|
|
1278
1279
|
get '/' do
|
@@ -1286,19 +1287,19 @@ end
|
|
1286
1287
|
|
1287
1288
|
セキュリティ向上のため、クッキー内のセッションデータはセッション秘密鍵(session secret)で署名されます。Sinatraによりランダムな秘密鍵が個別に生成されます。しかし、この秘密鍵はアプリケーションの立ち上げごとに変わってしまうので、すべてのアプリケーションのインスタンスで共有できる秘密鍵をセットしたくなるかもしれません。
|
1288
1289
|
|
1289
|
-
```
|
1290
|
+
```ruby
|
1290
1291
|
set :session_secret, 'super secret'
|
1291
1292
|
```
|
1292
1293
|
|
1293
1294
|
更に、設定変更をしたい場合は、`sessions`の設定においてオプションハッシュを保持することもできます。
|
1294
1295
|
|
1295
|
-
```
|
1296
|
+
```ruby
|
1296
1297
|
set :sessions, :domain => 'foo.com'
|
1297
1298
|
```
|
1298
1299
|
|
1299
1300
|
foo.comのサブドメイン上のアプリ間でセッションを共有化したいときは、代わりにドメインの前に *.* を付けます。
|
1300
1301
|
|
1301
|
-
```
|
1302
|
+
```ruby
|
1302
1303
|
set :sessions, :domain => '.foo.com'
|
1303
1304
|
```
|
1304
1305
|
|
@@ -1306,37 +1307,37 @@ set :sessions, :domain => '.foo.com'
|
|
1306
1307
|
|
1307
1308
|
フィルタまたはルーティング内で直ちにリクエストを止める場合
|
1308
1309
|
|
1309
|
-
```
|
1310
|
+
```ruby
|
1310
1311
|
halt
|
1311
1312
|
```
|
1312
1313
|
|
1313
1314
|
この際、ステータスを指定することもできます。
|
1314
1315
|
|
1315
|
-
```
|
1316
|
+
```ruby
|
1316
1317
|
halt 410
|
1317
1318
|
```
|
1318
1319
|
|
1319
1320
|
body部を指定することも、
|
1320
1321
|
|
1321
|
-
```
|
1322
|
+
```ruby
|
1322
1323
|
halt 'ここにbodyを書く'
|
1323
1324
|
```
|
1324
1325
|
|
1325
1326
|
ステータスとbody部を指定することも、
|
1326
1327
|
|
1327
|
-
```
|
1328
|
+
```ruby
|
1328
1329
|
halt 401, '立ち去れ!'
|
1329
1330
|
```
|
1330
1331
|
|
1331
1332
|
ヘッダを付けることもできます。
|
1332
1333
|
|
1333
|
-
```
|
1334
|
+
```ruby
|
1334
1335
|
halt 402, {'Content-Type' => 'text/plain'}, 'リベンジ'
|
1335
1336
|
```
|
1336
1337
|
|
1337
1338
|
もちろん、テンプレートを`halt`に結びつけることも可能です。
|
1338
1339
|
|
1339
|
-
```
|
1340
|
+
```ruby
|
1340
1341
|
halt erb(:error)
|
1341
1342
|
```
|
1342
1343
|
|
@@ -1344,7 +1345,7 @@ halt erb(:error)
|
|
1344
1345
|
|
1345
1346
|
ルーティングは`pass`を使って次のルーティングに飛ばすことができます。
|
1346
1347
|
|
1347
|
-
```
|
1348
|
+
```ruby
|
1348
1349
|
get '/guess/:who' do
|
1349
1350
|
pass unless params['who'] == 'Frank'
|
1350
1351
|
"見つかっちゃった!"
|
@@ -1361,7 +1362,7 @@ end
|
|
1361
1362
|
|
1362
1363
|
`pass`を使ってルーティングを飛ばすのではなく、他のルーティングを呼んだ結果を得たいというときがあります。これを実現するには`call`を使えばいいです。
|
1363
1364
|
|
1364
|
-
```
|
1365
|
+
```ruby
|
1365
1366
|
get '/foo' do
|
1366
1367
|
status, headers, body = call env.merge("PATH_INFO" => '/bar')
|
1367
1368
|
[status, headers, body.map(&:upcase)]
|
@@ -1383,7 +1384,7 @@ end
|
|
1383
1384
|
|
1384
1385
|
ステータスコードおよびレスポンスボディを、ルーティングブロックの戻り値にセットすることが可能であり、これは推奨されています。しかし、あるケースでは実行フローの任意のタイミングでボディをセットしたくなるかもしれません。`body`ヘルパーメソッドを使えばそれができます。そうすると、それ以降、ボディにアクセスするためにそのメソッドを使うことができるようになります。
|
1385
1386
|
|
1386
|
-
```
|
1387
|
+
```ruby
|
1387
1388
|
get '/foo' do
|
1388
1389
|
body "bar"
|
1389
1390
|
end
|
@@ -1397,7 +1398,7 @@ end
|
|
1397
1398
|
|
1398
1399
|
ボディと同様に、ステータスコードおよびヘッダもセットできます。
|
1399
1400
|
|
1400
|
-
```
|
1401
|
+
```ruby
|
1401
1402
|
get '/foo' do
|
1402
1403
|
status 418
|
1403
1404
|
headers \
|
@@ -1413,7 +1414,7 @@ end
|
|
1413
1414
|
|
1414
1415
|
レスポンスボディの部分を未だ生成している段階で、データを送り出したいということがあります。極端な例では、クライアントがコネクションを閉じるまでデータを送り続けたいことがあります。`stream`ヘルパーを使えば、独自ラッパーを作る必要はありません。
|
1415
1416
|
|
1416
|
-
```
|
1417
|
+
```ruby
|
1417
1418
|
get '/' do
|
1418
1419
|
stream do |out|
|
1419
1420
|
out << "それは伝 -\n"
|
@@ -1425,13 +1426,13 @@ get '/' do
|
|
1425
1426
|
end
|
1426
1427
|
```
|
1427
1428
|
|
1428
|
-
これはストリーミングAPI、[Server Sent Events](
|
1429
|
+
これはストリーミングAPI、[Server Sent Events](https://w3c.github.io/eventsource/)の実装を可能にし、[WebSockets](https://en.wikipedia.org/wiki/WebSocket)の土台に使うことができます。また、一部のコンテンツが遅いリソースに依存しているときに、スループットを上げるために使うこともできます。
|
1429
1430
|
|
1430
|
-
ノート: ストリーミングの挙動、特に並行リクエスト(cuncurrent requests)の数は、アプリケーションを提供するのに使われるWeb
|
1431
|
+
ノート: ストリーミングの挙動、特に並行リクエスト(cuncurrent requests)の数は、アプリケーションを提供するのに使われるWebサーバに強く依存します。いくつかのサーバは、ストリーミングを全くサポートしません。サーバがストリーミングをサポートしない場合、ボディは`stream`に渡されたブロックの実行が終了した後、一度に全部送られることになります。ストリーミングは、Shotgunを使った場合は全く動作しません。
|
1431
1432
|
|
1432
1433
|
オプション引数が`keep_open`にセットされている場合、ストリームオブジェクト上で`close`は呼ばれず、実行フローの任意の遅れたタイミングでユーザがこれを閉じることを可能にします。これはThinやRainbowsのようなイベント型サーバ上でしか機能しません。他のサーバでは依然ストリームは閉じられます。
|
1433
1434
|
|
1434
|
-
```
|
1435
|
+
```ruby
|
1435
1436
|
# ロングポーリング
|
1436
1437
|
|
1437
1438
|
set :server, :thin
|
@@ -1465,7 +1466,7 @@ end
|
|
1465
1466
|
リクエストスコープにおいて、`logger`ヘルパーは`Logger`インスタンスを作り出します。
|
1466
1467
|
|
1467
1468
|
|
1468
|
-
```
|
1469
|
+
```ruby
|
1469
1470
|
get '/' do
|
1470
1471
|
logger.info "loading data"
|
1471
1472
|
# ...
|
@@ -1476,7 +1477,7 @@ end
|
|
1476
1477
|
|
1477
1478
|
ノート: ロギングは、`Sinatra::Application`に対してのみデフォルトで有効にされているので、`Sinatra::Base`を継承している場合は、ユーザがこれを有効化する必要があります。
|
1478
1479
|
|
1479
|
-
```
|
1480
|
+
```ruby
|
1480
1481
|
class MyApp < Sinatra::Base
|
1481
1482
|
configure :production, :development do
|
1482
1483
|
enable :logging
|
@@ -1490,7 +1491,7 @@ end
|
|
1490
1491
|
|
1491
1492
|
`send_file`か静的ファイルを使う時、SinatraがMIMEタイプを理解できない場合があります。その時は `mime_type` を使ってファイル拡張子毎に登録して下さい。
|
1492
1493
|
|
1493
|
-
```
|
1494
|
+
```ruby
|
1494
1495
|
configure do
|
1495
1496
|
mime_type :foo, 'text/foo'
|
1496
1497
|
end
|
@@ -1498,7 +1499,7 @@ end
|
|
1498
1499
|
|
1499
1500
|
これは`content_type`ヘルパーで利用することができます:
|
1500
1501
|
|
1501
|
-
```
|
1502
|
+
```ruby
|
1502
1503
|
get '/' do
|
1503
1504
|
content_type :foo
|
1504
1505
|
"foo foo foo"
|
@@ -1509,7 +1510,7 @@ end
|
|
1509
1510
|
|
1510
1511
|
URLを生成するためには`url`ヘルパーメソッドが使えます。Hamlではこのようにします。
|
1511
1512
|
|
1512
|
-
```
|
1513
|
+
```ruby
|
1513
1514
|
%a{:href => url('/foo')} foo
|
1514
1515
|
```
|
1515
1516
|
|
@@ -1521,7 +1522,7 @@ URLを生成するためには`url`ヘルパーメソッドが使えます。Ham
|
|
1521
1522
|
|
1522
1523
|
`redirect` ヘルパーメソッドを使うことで、ブラウザをリダイレクトさせることができます。
|
1523
1524
|
|
1524
|
-
```
|
1525
|
+
```ruby
|
1525
1526
|
get '/foo' do
|
1526
1527
|
redirect to('/bar')
|
1527
1528
|
end
|
@@ -1529,14 +1530,14 @@ end
|
|
1529
1530
|
|
1530
1531
|
他に追加されるパラメータは、`halt`に渡される引数と同様に取り扱われます。
|
1531
1532
|
|
1532
|
-
```
|
1533
|
+
```ruby
|
1533
1534
|
redirect to('/bar'), 303
|
1534
|
-
redirect 'http://google.com', 'wrong place, buddy'
|
1535
|
+
redirect 'http://www.google.com/', 'wrong place, buddy'
|
1535
1536
|
```
|
1536
1537
|
|
1537
1538
|
また、`redirect back`を使えば、簡単にユーザが来たページへ戻るリダイレクトを作れます。
|
1538
1539
|
|
1539
|
-
```
|
1540
|
+
```ruby
|
1540
1541
|
get '/foo' do
|
1541
1542
|
"<a href='/bar'>do something</a>"
|
1542
1543
|
end
|
@@ -1550,13 +1551,13 @@ end
|
|
1550
1551
|
redirectに引数を渡すには、それをクエリーに追加するか、
|
1551
1552
|
|
1552
1553
|
|
1553
|
-
```
|
1554
|
+
```ruby
|
1554
1555
|
redirect to('/bar?sum=42')
|
1555
1556
|
```
|
1556
1557
|
|
1557
1558
|
または、セッションを使います。
|
1558
1559
|
|
1559
|
-
```
|
1560
|
+
```ruby
|
1560
1561
|
enable :sessions
|
1561
1562
|
|
1562
1563
|
get '/foo' do
|
@@ -1575,7 +1576,7 @@ end
|
|
1575
1576
|
|
1576
1577
|
キャッシュ制御ヘッダ(Cache-Control header)は、次のように簡単に設定できます。
|
1577
1578
|
|
1578
|
-
```
|
1579
|
+
```ruby
|
1579
1580
|
get '/' do
|
1580
1581
|
cache_control :public
|
1581
1582
|
"キャッシュしました!"
|
@@ -1584,7 +1585,7 @@ end
|
|
1584
1585
|
|
1585
1586
|
ヒント: キャッシングをbeforeフィルタ内で設定します。
|
1586
1587
|
|
1587
|
-
```
|
1588
|
+
```ruby
|
1588
1589
|
before do
|
1589
1590
|
cache_control :public, :must_revalidate, :max_age => 60
|
1590
1591
|
end
|
@@ -1592,7 +1593,7 @@ end
|
|
1592
1593
|
|
1593
1594
|
`expires`ヘルパーを対応するヘッダに使っている場合は、キャッシュ制御は自動で設定されます。
|
1594
1595
|
|
1595
|
-
```
|
1596
|
+
```ruby
|
1596
1597
|
before do
|
1597
1598
|
expires 500, :public, :must_revalidate
|
1598
1599
|
end
|
@@ -1600,7 +1601,7 @@ end
|
|
1600
1601
|
|
1601
1602
|
キャッシュを適切に使うために、`etag`または`last_modified`を使うことを検討してください。これらのヘルパーを、重い仕事をさせる *前* に呼ぶことを推奨します。そうすれば、クライアントが既にキャッシュに最新版を持っている場合はレスポンスを直ちに破棄するようになります。
|
1602
1603
|
|
1603
|
-
```
|
1604
|
+
```ruby
|
1604
1605
|
get '/article/:id' do
|
1605
1606
|
@article = Article.find params['id']
|
1606
1607
|
last_modified @article.updated_at
|
@@ -1609,16 +1610,16 @@ get '/article/:id' do
|
|
1609
1610
|
end
|
1610
1611
|
```
|
1611
1612
|
|
1612
|
-
また、[weak ETag](
|
1613
|
+
また、[weak ETag](https://ja.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation)を使うこともできます。
|
1613
1614
|
|
1614
|
-
```
|
1615
|
+
```ruby
|
1615
1616
|
etag @article.sha1, :weak
|
1616
1617
|
```
|
1617
1618
|
|
1618
1619
|
これらのヘルパーは、キャッシングをしてくれませんが、必要な情報をキャッシュに与えてくれます。もし手早いリバースプロキシキャッシングの解決策をお探しなら、 [rack-cache](https://github.com/rtomayko/rack-cache)を試してください。
|
1619
1620
|
|
1620
1621
|
|
1621
|
-
```
|
1622
|
+
```ruby
|
1622
1623
|
require "rack/cache"
|
1623
1624
|
require "sinatra"
|
1624
1625
|
|
@@ -1635,7 +1636,7 @@ end
|
|
1635
1636
|
|
1636
1637
|
RFC 2616によれば、アプリケーションは、If-MatchまたはIf-None-Matchヘッダが`*`に設定されている場合には、要求されたリソースが既に存在するか否かに応じて、異なる振る舞いをすべきとなっています。Sinatraは、getのような安全なリクエストおよびputのような冪等なリクエストは既に存在しているものとして仮定し、一方で、他のリソース(例えば、postリクエスト)は新たなリソースとして取り扱われるよう仮定します。この振る舞いは、`:new_resource`オプションを渡すことで変更できます。
|
1637
1638
|
|
1638
|
-
```
|
1639
|
+
```ruby
|
1639
1640
|
get '/create' do
|
1640
1641
|
etag '', :new_resource => true
|
1641
1642
|
Article.create
|
@@ -1645,7 +1646,7 @@ end
|
|
1645
1646
|
|
1646
1647
|
ここでもWeak ETagを使いたい場合は、`:kind`オプションを渡してください。
|
1647
1648
|
|
1648
|
-
```
|
1649
|
+
```ruby
|
1649
1650
|
etag '', :new_resource => true, :kind => :weak
|
1650
1651
|
```
|
1651
1652
|
|
@@ -1653,7 +1654,7 @@ etag '', :new_resource => true, :kind => :weak
|
|
1653
1654
|
|
1654
1655
|
ファイルを送信するには、`send_file`ヘルパーメソッドを使います。
|
1655
1656
|
|
1656
|
-
```
|
1657
|
+
```ruby
|
1657
1658
|
get '/' do
|
1658
1659
|
send_file 'foo.png'
|
1659
1660
|
end
|
@@ -1661,7 +1662,7 @@ end
|
|
1661
1662
|
|
1662
1663
|
これはオプションを取ることもできます。
|
1663
1664
|
|
1664
|
-
```
|
1665
|
+
```ruby
|
1665
1666
|
send_file 'foo.png', :type => :jpg
|
1666
1667
|
```
|
1667
1668
|
|
@@ -1699,7 +1700,7 @@ send_file 'foo.png', :type => :jpg
|
|
1699
1700
|
|
1700
1701
|
受信するリクエストオブジェクトは、`request`メソッドを通じてリクエストレベル(フィルタ、ルーティング、エラーハンドラ)からアクセスすることができます。
|
1701
1702
|
|
1702
|
-
```
|
1703
|
+
```ruby
|
1703
1704
|
# アプリケーションが http://example.com/example で動作している場合
|
1704
1705
|
get '/foo' do
|
1705
1706
|
t = %w[text/css text/html application/javascript]
|
@@ -1734,7 +1735,7 @@ end
|
|
1734
1735
|
|
1735
1736
|
`script_name`や`path_info`などのオプションは次のように利用することもできます。
|
1736
1737
|
|
1737
|
-
```
|
1738
|
+
```ruby
|
1738
1739
|
before { request.path_info = "/" }
|
1739
1740
|
|
1740
1741
|
get "/" do
|
@@ -1744,7 +1745,7 @@ end
|
|
1744
1745
|
|
1745
1746
|
`request.body`はIOまたはStringIOのオブジェクトです。
|
1746
1747
|
|
1747
|
-
```
|
1748
|
+
```ruby
|
1748
1749
|
post "/api" do
|
1749
1750
|
request.body.rewind # 既に読まれているときのため
|
1750
1751
|
data = JSON.parse request.body.read
|
@@ -1756,7 +1757,7 @@ end
|
|
1756
1757
|
|
1757
1758
|
`attachment`ヘルパーを使って、レスポンスがブラウザに表示されるのではなく、ディスクに保存されることをブラウザに対し通知することができます。
|
1758
1759
|
|
1759
|
-
```
|
1760
|
+
```ruby
|
1760
1761
|
get '/' do
|
1761
1762
|
attachment
|
1762
1763
|
"保存しました!"
|
@@ -1765,7 +1766,7 @@ end
|
|
1765
1766
|
|
1766
1767
|
ファイル名を渡すこともできます。
|
1767
1768
|
|
1768
|
-
```
|
1769
|
+
```ruby
|
1769
1770
|
get '/' do
|
1770
1771
|
attachment "info.txt"
|
1771
1772
|
"保存しました!"
|
@@ -1776,7 +1777,7 @@ end
|
|
1776
1777
|
|
1777
1778
|
Sinatraは`time_for`ヘルパーメソッドを提供しており、それは与えられた値からTimeオブジェクトを生成します。これはまた`DateTime`、`Date`および類似のクラスを変換できます。
|
1778
1779
|
|
1779
|
-
```
|
1780
|
+
```ruby
|
1780
1781
|
get '/' do
|
1781
1782
|
pass if Time.now > time_for('Dec 23, 2012')
|
1782
1783
|
"まだ時間がある"
|
@@ -1785,7 +1786,7 @@ end
|
|
1785
1786
|
|
1786
1787
|
このメソッドは、`expires`、`last_modified`といった種類のものの内部で使われています。そのため、アプリケーションにおいて、`time_for`をオーバーライドすることでそれらのメソッドの挙動を簡単に拡張できます。
|
1787
1788
|
|
1788
|
-
```
|
1789
|
+
```ruby
|
1789
1790
|
helpers do
|
1790
1791
|
def time_for(value)
|
1791
1792
|
case value
|
@@ -1807,7 +1808,7 @@ end
|
|
1807
1808
|
|
1808
1809
|
`find_template`ヘルパーは、レンダリングのためのテンプレートファイルを見つけるために使われます。
|
1809
1810
|
|
1810
|
-
```
|
1811
|
+
```ruby
|
1811
1812
|
find_template settings.views, 'foo', Tilt[:haml] do |file|
|
1812
1813
|
puts "could be #{file}"
|
1813
1814
|
end
|
@@ -1816,7 +1817,7 @@ end
|
|
1816
1817
|
この例はあまり有益ではありません。しかし、このメソッドを、独自の探索機構で働くようオーバーライドするなら有益になります。例えば、複数のビューディレクトリを使えるようにしたいときがあります。
|
1817
1818
|
|
1818
1819
|
|
1819
|
-
```
|
1820
|
+
```ruby
|
1820
1821
|
set :views, ['views', 'templates']
|
1821
1822
|
|
1822
1823
|
helpers do
|
@@ -1828,7 +1829,7 @@ end
|
|
1828
1829
|
|
1829
1830
|
他の例としては、異なるエンジン用の異なるディレクトリを使う場合です。
|
1830
1831
|
|
1831
|
-
```
|
1832
|
+
```ruby
|
1832
1833
|
set :views, :sass => 'views/sass', :haml => 'templates', :default => 'views'
|
1833
1834
|
|
1834
1835
|
helpers do
|
@@ -1848,7 +1849,7 @@ end
|
|
1848
1849
|
|
1849
1850
|
どの環境でも起動時に1回だけ実行されます。
|
1850
1851
|
|
1851
|
-
```
|
1852
|
+
```ruby
|
1852
1853
|
configure do
|
1853
1854
|
# 1つのオプションをセット
|
1854
1855
|
set :option, 'value'
|
@@ -1869,7 +1870,7 @@ end
|
|
1869
1870
|
|
1870
1871
|
環境設定(`RACK_ENV`環境変数)が`:production`に設定されている時だけ実行する方法:
|
1871
1872
|
|
1872
|
-
```
|
1873
|
+
```ruby
|
1873
1874
|
configure :production do
|
1874
1875
|
...
|
1875
1876
|
end
|
@@ -1877,7 +1878,7 @@ end
|
|
1877
1878
|
|
1878
1879
|
環境設定が`:production`か`:test`に設定されている時だけ実行する方法:
|
1879
1880
|
|
1880
|
-
```
|
1881
|
+
```ruby
|
1881
1882
|
configure :production, :test do
|
1882
1883
|
...
|
1883
1884
|
end
|
@@ -1885,7 +1886,7 @@ end
|
|
1885
1886
|
|
1886
1887
|
設定したオプションには`settings`からアクセスできます:
|
1887
1888
|
|
1888
|
-
```
|
1889
|
+
```ruby
|
1889
1890
|
configure do
|
1890
1891
|
set :foo, 'bar'
|
1891
1892
|
end
|
@@ -1899,26 +1900,26 @@ end
|
|
1899
1900
|
|
1900
1901
|
### 攻撃防御に対する設定
|
1901
1902
|
|
1902
|
-
Sinatraは、[Rack::Protection](https://github.com/
|
1903
|
+
Sinatraは、[Rack::Protection](https://github.com/sinatra/rack-protection#readme)を使って、アプリケーションを多発する日和見的攻撃から守っています。この挙動は簡単に無効化できます(これはアプリケーションを大量の脆弱性攻撃に晒すことになります)。
|
1903
1904
|
|
1904
|
-
```
|
1905
|
+
```ruby
|
1905
1906
|
disable :protection
|
1906
1907
|
```
|
1907
1908
|
|
1908
1909
|
単一の防御層を外すためには、`protection`をオプションハッシュにセットします。
|
1909
1910
|
|
1910
|
-
```
|
1911
|
+
```ruby
|
1911
1912
|
set :protection, :except => :path_traversal
|
1912
1913
|
```
|
1913
1914
|
また配列を渡して、複数の防御を無効にすることもできます。
|
1914
1915
|
|
1915
|
-
```
|
1916
|
+
```ruby
|
1916
1917
|
set :protection, :except => [:path_traversal, :session_hijacking]
|
1917
1918
|
```
|
1918
1919
|
|
1919
1920
|
デフォルトでSinatraは、`:sessions`が有効になっている場合、セッションベースの防御だけを設定します。しかし、自身でセッションを設定したい場合があります。その場合は、`:session`オプションを渡すことにより、セッションベースの防御を設定することができます。
|
1920
1921
|
|
1921
|
-
```
|
1922
|
+
```ruby
|
1922
1923
|
use Rack::Session::Pool
|
1923
1924
|
set :protection, :session => true
|
1924
1925
|
```
|
@@ -2073,13 +2074,13 @@ set :protection, :session => true
|
|
2073
2074
|
|
2074
2075
|
異なる環境を走らせるには、`RACK_ENV`環境変数を設定します。
|
2075
2076
|
|
2076
|
-
```
|
2077
|
+
```shell
|
2077
2078
|
RACK_ENV=production ruby my_app.rb
|
2078
2079
|
```
|
2079
2080
|
|
2080
2081
|
既定メソッド、`development?`、`test?`および`production?`を、現在の環境設定を確認するために使えます。
|
2081
2082
|
|
2082
|
-
```
|
2083
|
+
```ruby
|
2083
2084
|
get '/' do
|
2084
2085
|
if settings.development?
|
2085
2086
|
"development!"
|
@@ -2097,7 +2098,7 @@ end
|
|
2097
2098
|
|
2098
2099
|
`Sinatra::NotFound`例外が発生したとき、またはレスポンスのステータスコードが404のときに、`not_found`ハンドラが発動します。
|
2099
2100
|
|
2100
|
-
```
|
2101
|
+
```ruby
|
2101
2102
|
not_found do
|
2102
2103
|
'ファイルが存在しません'
|
2103
2104
|
end
|
@@ -2107,7 +2108,7 @@ end
|
|
2107
2108
|
|
2108
2109
|
`error`ハンドラはルーティングブロックまたはフィルタ内で例外が発生したときはいつでも発動します。例外オブジェクトはRack変数`sinatra.error`から取得できます。
|
2109
2110
|
|
2110
|
-
```
|
2111
|
+
```ruby
|
2111
2112
|
error do
|
2112
2113
|
'エラーが発生しました。 - ' + env['sinatra.error'].message
|
2113
2114
|
end
|
@@ -2115,7 +2116,7 @@ end
|
|
2115
2116
|
|
2116
2117
|
エラーをカスタマイズする場合は、
|
2117
2118
|
|
2118
|
-
```
|
2119
|
+
```ruby
|
2119
2120
|
error MyCustomError do
|
2120
2121
|
'エラーメッセージ...' + env['sinatra.error'].message
|
2121
2122
|
end
|
@@ -2123,7 +2124,7 @@ end
|
|
2123
2124
|
|
2124
2125
|
と書いておいて、下記のように呼び出します。
|
2125
2126
|
|
2126
|
-
```
|
2127
|
+
```ruby
|
2127
2128
|
get '/' do
|
2128
2129
|
raise MyCustomError, '何かがまずかったようです'
|
2129
2130
|
end
|
@@ -2137,7 +2138,7 @@ end
|
|
2137
2138
|
|
2138
2139
|
あるいは、ステータスコードに対応するエラーハンドラを設定することもできます。
|
2139
2140
|
|
2140
|
-
```
|
2141
|
+
```ruby
|
2141
2142
|
error 403 do
|
2142
2143
|
'Access forbidden'
|
2143
2144
|
end
|
@@ -2149,7 +2150,7 @@ end
|
|
2149
2150
|
|
2150
2151
|
範囲指定もできます。
|
2151
2152
|
|
2152
|
-
```
|
2153
|
+
```ruby
|
2153
2154
|
error 400..510 do
|
2154
2155
|
'Boom'
|
2155
2156
|
end
|
@@ -2164,7 +2165,7 @@ SinatraはRuby製Webフレームワークのミニマルな標準的インタフ
|
|
2164
2165
|
|
2165
2166
|
Sinatraはトップレベルの`use`メソッドを通して、Rackミドルウェアパイプラインの構築を楽にします。
|
2166
2167
|
|
2167
|
-
```
|
2168
|
+
```ruby
|
2168
2169
|
require 'sinatra'
|
2169
2170
|
require 'my_custom_middleware'
|
2170
2171
|
|
@@ -2176,9 +2177,9 @@ get '/hello' do
|
|
2176
2177
|
end
|
2177
2178
|
```
|
2178
2179
|
|
2179
|
-
`use`の文法は、[Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder)DSLで定義されているそれ(rackupファイルで最もよく使われる)と同じです。例えば `use`メソッドは複数の引数、そしてブロックも取ることができます。
|
2180
|
+
`use`の文法は、[Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder)DSLで定義されているそれ(rackupファイルで最もよく使われる)と同じです。例えば `use`メソッドは複数の引数、そしてブロックも取ることができます。
|
2180
2181
|
|
2181
|
-
```
|
2182
|
+
```ruby
|
2182
2183
|
use Rack::Auth::Basic do |username, password|
|
2183
2184
|
username == 'admin' && password == 'secret'
|
2184
2185
|
end
|
@@ -2194,9 +2195,9 @@ Rackは、ロギング、デバッギング、URLルーティング、認証、
|
|
2194
2195
|
|
2195
2196
|
## テスト(Testing)
|
2196
2197
|
|
2197
|
-
SinatraでのテストはRackベースのテストライブラリまたはフレームワークを使って書くことができます。[Rack::Test](http://
|
2198
|
+
SinatraでのテストはRackベースのテストライブラリまたはフレームワークを使って書くことができます。[Rack::Test](http://www.rubydoc.info/github/brynary/rack-test/master/frames)をお薦めします。
|
2198
2199
|
|
2199
|
-
```
|
2200
|
+
```ruby
|
2200
2201
|
require 'my_sinatra_app'
|
2201
2202
|
require 'minitest/autorun'
|
2202
2203
|
require 'rack/test'
|
@@ -2231,7 +2232,7 @@ end
|
|
2231
2232
|
|
2232
2233
|
軽量なアプリケーションであれば、トップレベルでアプリケーションを定義していくことはうまくいきますが、再利用性可能なコンポーネント、例えばRackミドルウェア、RailsのMetal、サーバコンポーネントを含むシンプルなライブラリ、あるいはSinatraの拡張プログラムを構築するような場合、これは無視できない欠点を持つものとなります。トップレベルは、軽量なアプリケーションのスタイルにおける設定(例えば、単一のアプリケーションファイル、`./public`および`./views`ディレクトリ、ロギング、例外詳細ページなど)を仮定しています。そこで`Sinatra::Base`の出番です。
|
2233
2234
|
|
2234
|
-
```
|
2235
|
+
```ruby
|
2235
2236
|
require 'sinatra/base'
|
2236
2237
|
|
2237
2238
|
class MyApp < Sinatra::Base
|
@@ -2250,7 +2251,7 @@ end
|
|
2250
2251
|
(そうしない場合、SinatraのDSLメソッドの全てがmainの名前空間にインポートされます)
|
2251
2252
|
* ルーティング、エラーハンドラ、フィルタ、オプションを`Sinatra::Base`のサブクラスに書く
|
2252
2253
|
|
2253
|
-
`Sinatra::Base`はまっさらです。ビルトインサーバを含む、ほとんどのオプションがデフォルトで無効になっています。利用可能なオプションとその挙動の詳細については[Configuring Settings](http://
|
2254
|
+
`Sinatra::Base`はまっさらです。ビルトインサーバを含む、ほとんどのオプションがデフォルトで無効になっています。利用可能なオプションとその挙動の詳細については[Configuring Settings](http://www.sinatrarb.com/configuration.html)(英語)をご覧下さい。
|
2254
2255
|
|
2255
2256
|
もしもクラシックスタイルと同じような挙動のアプリケーションをトップレベルで定義させる必要があれば、`Sinatra::Application`をサブクラス化させてください。
|
2256
2257
|
|
@@ -2318,7 +2319,7 @@ end
|
|
2318
2319
|
<tr>
|
2319
2320
|
<td>static</td>
|
2320
2321
|
<td>true</td>
|
2321
|
-
<td>
|
2322
|
+
<td>File.exist?(public_folder)</td>
|
2322
2323
|
<td>true</td>
|
2323
2324
|
</tr>
|
2324
2325
|
</table>
|
@@ -2327,7 +2328,7 @@ end
|
|
2327
2328
|
|
2328
2329
|
モジュラーアプリケーションを開始、つまり`run!`を使って開始させる二種類のやり方があります。
|
2329
2330
|
|
2330
|
-
```
|
2331
|
+
```ruby
|
2331
2332
|
# my_app.rb
|
2332
2333
|
require 'sinatra/base'
|
2333
2334
|
|
@@ -2341,13 +2342,13 @@ end
|
|
2341
2342
|
|
2342
2343
|
として、次のように起動するか、
|
2343
2344
|
|
2344
|
-
```
|
2345
|
+
```shell
|
2345
2346
|
ruby my_app.rb
|
2346
2347
|
```
|
2347
2348
|
|
2348
2349
|
または、Rackハンドラを使えるようにする`config.ru`ファイルを書いて、
|
2349
2350
|
|
2350
|
-
```
|
2351
|
+
```ruby
|
2351
2352
|
# config.ru (rackupで起動)
|
2352
2353
|
require './my_app'
|
2353
2354
|
run MyApp
|
@@ -2355,7 +2356,7 @@ run MyApp
|
|
2355
2356
|
|
2356
2357
|
起動します。
|
2357
2358
|
|
2358
|
-
```
|
2359
|
+
```shell
|
2359
2360
|
rackup -p 4567
|
2360
2361
|
```
|
2361
2362
|
|
@@ -2363,7 +2364,7 @@ rackup -p 4567
|
|
2363
2364
|
|
2364
2365
|
アプリケーションファイルと、
|
2365
2366
|
|
2366
|
-
```
|
2367
|
+
```ruby
|
2367
2368
|
# app.rb
|
2368
2369
|
require 'sinatra'
|
2369
2370
|
|
@@ -2374,7 +2375,7 @@ end
|
|
2374
2375
|
|
2375
2376
|
対応する`config.ru`を書きます。
|
2376
2377
|
|
2377
|
-
```
|
2378
|
+
```ruby
|
2378
2379
|
require './app'
|
2379
2380
|
run Sinatra::Application
|
2380
2381
|
```
|
@@ -2396,7 +2397,7 @@ Sinatraは他のRackミドルウェアを利用することができるだけで
|
|
2396
2397
|
|
2397
2398
|
このエンドポイントには、別のSinatraアプリケーションまたは他のRackベースのアプリケーション(Rails/Ramaze/Camping/…)が用いられるでしょう。
|
2398
2399
|
|
2399
|
-
```
|
2400
|
+
```ruby
|
2400
2401
|
require 'sinatra/base'
|
2401
2402
|
|
2402
2403
|
class LoginScreen < Sinatra::Base
|
@@ -2431,7 +2432,7 @@ end
|
|
2431
2432
|
|
2432
2433
|
新しいアプリケーションを実行時に、定数に割り当てることなく生成したくなる場合があるでしょう。`Sinatra.new`を使えばそれができます。
|
2433
2434
|
|
2434
|
-
```
|
2435
|
+
```ruby
|
2435
2436
|
require 'sinatra/base'
|
2436
2437
|
my_app = Sinatra.new { get('/') { "hi" } }
|
2437
2438
|
my_app.run!
|
@@ -2461,7 +2462,7 @@ end
|
|
2461
2462
|
|
2462
2463
|
これはまた、Sinatraをミドルウェアとして利用することを極めて簡単にします。
|
2463
2464
|
|
2464
|
-
```
|
2465
|
+
```ruby
|
2465
2466
|
require 'sinatra/base'
|
2466
2467
|
|
2467
2468
|
use Sinatra do
|
@@ -2485,7 +2486,7 @@ run RailsProject::Application
|
|
2485
2486
|
|
2486
2487
|
`set`によって作られたオプションはクラスレベルのメソッドです。
|
2487
2488
|
|
2488
|
-
```
|
2489
|
+
```ruby
|
2489
2490
|
class MyApp < Sinatra::Base
|
2490
2491
|
# アプリケーションスコープの中だよ!
|
2491
2492
|
set :foo, 42
|
@@ -2516,7 +2517,7 @@ end
|
|
2516
2517
|
このスコープの内側からは`request`や`session`オブジェクトにアクセスすることができ、`erb`や`haml`のようなレンダリングメソッドを呼び出すことができます。
|
2517
2518
|
リクエストスコープの内側からは、`settings`ヘルパーによってアプリケーションスコープにアクセスすることができます。
|
2518
2519
|
|
2519
|
-
```
|
2520
|
+
```ruby
|
2520
2521
|
class MyApp < Sinatra::Base
|
2521
2522
|
# アプリケーションスコープの中だよ!
|
2522
2523
|
get '/define_route/:name' do
|
@@ -2560,7 +2561,7 @@ mixin](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/base.rb#L1609
|
|
2560
2561
|
|
2561
2562
|
Sinatraアプリケーションは直接実行できます。
|
2562
2563
|
|
2563
|
-
```
|
2564
|
+
```shell
|
2564
2565
|
ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
2565
2566
|
```
|
2566
2567
|
|
@@ -2575,6 +2576,37 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
|
2575
2576
|
-x # mutex lockを付ける (デフォルトはoff)
|
2576
2577
|
```
|
2577
2578
|
|
2579
|
+
### マルチスレッド
|
2580
|
+
|
2581
|
+
_この[StackOverflow][so-answer]でのKonstantinによる回答を言い換えています。_
|
2582
|
+
|
2583
|
+
Sinatraでは同時実行モデルを負わせることはできませんが、根本的な部分であるThinやPuma、WebrickのようなRackハンドラ(サーバー)部分に委ねることができます。
|
2584
|
+
Sinatra自身はスレッドセーフであり、もしRackハンドラが同時実行モデルのスレッドを使用していても問題はありません。
|
2585
|
+
つまり、これはサーバーを起動させる時、特定のRackハンドラに対して正しい起動処理を特定することが出来ます。
|
2586
|
+
この例はThinサーバーをマルチスレッドで起動する方法のデモです。
|
2587
|
+
|
2588
|
+
```ruby
|
2589
|
+
# app.rb
|
2590
|
+
|
2591
|
+
require 'sinatra/base'
|
2592
|
+
|
2593
|
+
class App < Sinatra::Base
|
2594
|
+
get '/' do
|
2595
|
+
"Hello, World"
|
2596
|
+
end
|
2597
|
+
end
|
2598
|
+
|
2599
|
+
App.run!
|
2600
|
+
```
|
2601
|
+
|
2602
|
+
サーバーを開始するコマンドです。
|
2603
|
+
|
2604
|
+
```
|
2605
|
+
thin --threaded start
|
2606
|
+
```
|
2607
|
+
|
2608
|
+
[so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
|
2609
|
+
|
2578
2610
|
## 必要環境
|
2579
2611
|
|
2580
2612
|
次のRubyバージョンが公式にサポートされています。
|
@@ -2636,7 +2668,7 @@ Sinatraは現在、Cardinal、SmallRuby、BlueRubyまたは1.8.7以前のバー
|
|
2636
2668
|
|
2637
2669
|
Sinatraの最新開発版のコードを使いたい場合は、マスターブランチに対してアプリケーションを走らせて構いません。ある程度安定しています。また、適宜プレリリース版gemをpushしているので、
|
2638
2670
|
|
2639
|
-
```
|
2671
|
+
```shell
|
2640
2672
|
gem install sinatra --pre
|
2641
2673
|
```
|
2642
2674
|
|
@@ -2644,11 +2676,11 @@ gem install sinatra --pre
|
|
2644
2676
|
|
2645
2677
|
### Bundlerを使う場合
|
2646
2678
|
|
2647
|
-
最新のSinatraでアプリケーションを動作させたい場合には、[Bundler](http://
|
2679
|
+
最新のSinatraでアプリケーションを動作させたい場合には、[Bundler](http://bundler.io)を使うのがお薦めのやり方です。
|
2648
2680
|
|
2649
2681
|
まず、Bundlerがなければそれをインストールします。
|
2650
2682
|
|
2651
|
-
```
|
2683
|
+
```shell
|
2652
2684
|
gem install bundler
|
2653
2685
|
```
|
2654
2686
|
|
@@ -2667,7 +2699,7 @@ gem 'activerecord', '~> 3.0' # ActiveRecord 3.xが必要かもしれません
|
|
2667
2699
|
|
2668
2700
|
これで、以下のようにしてアプリケーションを起動することができます。
|
2669
2701
|
|
2670
|
-
```
|
2702
|
+
```shell
|
2671
2703
|
bundle exec ruby myapp.rb
|
2672
2704
|
```
|
2673
2705
|
|
@@ -2675,7 +2707,7 @@ bundle exec ruby myapp.rb
|
|
2675
2707
|
|
2676
2708
|
ローカルにクローンを作って、`sinatra/lib`ディレクトリを`$LOAD_PATH`に追加してアプリケーションを起動します。
|
2677
2709
|
|
2678
|
-
```
|
2710
|
+
```shell
|
2679
2711
|
cd myapp
|
2680
2712
|
git clone git://github.com/sinatra/sinatra.git
|
2681
2713
|
ruby -I sinatra/lib myapp.rb
|
@@ -2683,7 +2715,7 @@ ruby -I sinatra/lib myapp.rb
|
|
2683
2715
|
|
2684
2716
|
追ってSinatraのソースを更新する方法。
|
2685
2717
|
|
2686
|
-
```
|
2718
|
+
```shell
|
2687
2719
|
cd myapp/sinatra
|
2688
2720
|
git pull
|
2689
2721
|
```
|
@@ -2692,7 +2724,7 @@ git pull
|
|
2692
2724
|
|
2693
2725
|
Sinatraのgemを自身でビルドすることもできます。
|
2694
2726
|
|
2695
|
-
```
|
2727
|
+
```shell
|
2696
2728
|
git clone git://github.com/sinatra/sinatra.git
|
2697
2729
|
cd sinatra
|
2698
2730
|
rake sinatra.gemspec
|
@@ -2701,7 +2733,7 @@ rake install
|
|
2701
2733
|
|
2702
2734
|
gemをルートとしてインストールする場合は、最後のステップはこうなります。
|
2703
2735
|
|
2704
|
-
```
|
2736
|
+
```shell
|
2705
2737
|
sudo rake install
|
2706
2738
|
```
|
2707
2739
|
|
@@ -2711,14 +2743,14 @@ Sinatraは、[Semantic Versioning](http://semver.org/)におけるSemVerおよ
|
|
2711
2743
|
|
2712
2744
|
## 参考文献
|
2713
2745
|
|
2714
|
-
* [プロジェクトサイト](http://
|
2715
|
-
* [プロジェクトに参加(貢献)する](http://
|
2716
|
-
* [Issue tracker](
|
2717
|
-
* [Twitter](
|
2746
|
+
* [プロジェクトサイト](http://www.sinatrarb.com/) - ドキュメント、ニュース、他のリソースへのリンクがあります。
|
2747
|
+
* [プロジェクトに参加(貢献)する](http://www.sinatrarb.com/contributing.html) - バグレポート パッチの送信、サポートなど
|
2748
|
+
* [Issue tracker](https://github.com/sinatra/sinatra/issues)
|
2749
|
+
* [Twitter](https://twitter.com/sinatra)
|
2718
2750
|
* [メーリングリスト](http://groups.google.com/group/sinatrarb/topics)
|
2719
2751
|
* http://freenode.net上のIRC: [#sinatra](irc://chat.freenode.net/#sinatra)
|
2720
2752
|
* [Sinatra Book](https://github.com/sinatra/sinatra-book/) クックブック、チュートリアル
|
2721
2753
|
* [Sinatra Recipes](http://recipes.sinatrarb.com/) コミュニティによるレシピ集
|
2722
|
-
* http://rubydoc.info
|
2723
|
-
* [CIサーバ](
|
2754
|
+
* http://www.rubydoc.info/上のAPIドキュメント: [最新版(latest release)用](http://www.rubydoc.info/gems/sinatra)または[現在のHEAD用](http://www.rubydoc.info/github/sinatra/sinatra)
|
2755
|
+
* [CIサーバ](https://travis-ci.org/sinatra/sinatra)
|
2724
2756
|
* [Greenbear Laboratory Rack日本語マニュアル](http://route477.net/w/RackReferenceJa.html)
|