sinatra 1.0 → 1.1.a
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.
- data/CHANGES +108 -1
- data/LICENSE +1 -1
- data/README.de.rdoc +1024 -0
- data/README.es.rdoc +1047 -0
- data/README.fr.rdoc +1038 -0
- data/README.hu.rdoc +607 -0
- data/README.jp.rdoc +473 -15
- data/README.rdoc +429 -41
- data/Rakefile +17 -6
- data/lib/sinatra/base.rb +357 -158
- data/lib/sinatra/showexceptions.rb +9 -1
- data/sinatra.gemspec +52 -9
- data/test/builder_test.rb +25 -1
- data/test/coffee_test.rb +88 -0
- data/test/encoding_test.rb +18 -0
- data/test/filter_test.rb +61 -2
- data/test/hello.mab +1 -0
- data/test/helper.rb +1 -0
- data/test/helpers_test.rb +141 -37
- data/test/less_test.rb +26 -2
- data/test/liquid_test.rb +58 -0
- data/test/markaby_test.rb +58 -0
- data/test/markdown_test.rb +35 -0
- data/test/nokogiri_test.rb +69 -0
- data/test/radius_test.rb +59 -0
- data/test/rdoc_test.rb +34 -0
- data/test/request_test.rb +12 -0
- data/test/routing_test.rb +35 -1
- data/test/sass_test.rb +46 -16
- data/test/scss_test.rb +88 -0
- data/test/settings_test.rb +32 -0
- data/test/sinatra_test.rb +4 -0
- data/test/static_test.rb +64 -0
- data/test/templates_test.rb +55 -1
- data/test/textile_test.rb +34 -0
- data/test/views/ascii.haml +2 -0
- data/test/views/explicitly_nested.str +1 -0
- data/test/views/hello.coffee +1 -0
- data/test/views/hello.liquid +1 -0
- data/test/views/hello.mab +1 -0
- data/test/views/hello.md +1 -0
- data/test/views/hello.nokogiri +1 -0
- data/test/views/hello.radius +1 -0
- data/test/views/hello.rdoc +1 -0
- data/test/views/hello.sass +1 -1
- data/test/views/hello.scss +3 -0
- data/test/views/hello.str +1 -0
- data/test/views/hello.textile +1 -0
- data/test/views/layout2.liquid +2 -0
- data/test/views/layout2.mab +2 -0
- data/test/views/layout2.nokogiri +3 -0
- data/test/views/layout2.radius +2 -0
- data/test/views/layout2.str +2 -0
- data/test/views/nested.str +1 -0
- data/test/views/utf8.haml +2 -0
- metadata +240 -33
- data/lib/sinatra/tilt.rb +0 -746
data/README.jp.rdoc
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
= Sinatra
|
2
|
+
<i>注) 本文書は英語から翻訳したものであり、その内容が最新でない場合もあります。最新の情報はオリジナルの英語版を参照して下さい。</i>
|
2
3
|
|
3
4
|
SinatraはRubyで下記のような最小労力で手早くウェブアプリケーションを作成するためのDSLです。
|
4
5
|
|
5
6
|
# myapp.rb
|
6
|
-
require 'rubygems'
|
7
7
|
require 'sinatra'
|
8
8
|
get '/' do
|
9
9
|
'Hello world!'
|
@@ -11,8 +11,8 @@ SinatraはRubyで下記のような最小労力で手早くウェブアプリケ
|
|
11
11
|
|
12
12
|
gemをインストールして動かしてみる。
|
13
13
|
|
14
|
-
|
15
|
-
ruby myapp.rb
|
14
|
+
gem install sinatra
|
15
|
+
ruby -rubygems myapp.rb
|
16
16
|
|
17
17
|
http://localhost:4567 を見る。
|
18
18
|
|
@@ -79,6 +79,9 @@ Sinatraでは、ルートはHTTPメソッドとURLマッチングパターンが
|
|
79
79
|
"Hello, #{c}!"
|
80
80
|
end
|
81
81
|
|
82
|
+
|
83
|
+
=== 条件
|
84
|
+
|
82
85
|
ルートにはユーザエージェントのようなさまざまな条件を含めることができます。
|
83
86
|
|
84
87
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
@@ -89,6 +92,58 @@ Sinatraでは、ルートはHTTPメソッドとURLマッチングパターンが
|
|
89
92
|
# Matches non-songbird browsers
|
90
93
|
end
|
91
94
|
|
95
|
+
ほかに+host_name+と+provides+条件が利用可能です:
|
96
|
+
|
97
|
+
get '/', :host_name => /^admin\./ do
|
98
|
+
"Admin Area, Access denied!"
|
99
|
+
end
|
100
|
+
|
101
|
+
get '/', :provides => 'html' do
|
102
|
+
haml :index
|
103
|
+
end
|
104
|
+
|
105
|
+
get '/', :provides => ['rss', 'atom', 'xml'] do
|
106
|
+
builder :feed
|
107
|
+
end
|
108
|
+
|
109
|
+
独自の条件を定義することも簡単にできます:
|
110
|
+
|
111
|
+
set(:probability) { |value| condition { rand <= value } }
|
112
|
+
|
113
|
+
get '/win_a_car', :probability => 0.1 do
|
114
|
+
"You won!"
|
115
|
+
end
|
116
|
+
|
117
|
+
get '/win_a_car' do
|
118
|
+
"Sorry, you lost."
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
=== 戻り値
|
123
|
+
|
124
|
+
ルートブロックの戻り値は、HTTPクライアントまたはRackスタックでの次のミドルウェアに渡されるレスポンスボディを決定します。
|
125
|
+
|
126
|
+
これは大抵の場合、上の例のように文字列ですが、それ以外の値も使用することができます。
|
127
|
+
|
128
|
+
Rackレスポンス、Rackボディオブジェクト、HTTPステータスコードのいずれかとして
|
129
|
+
妥当なオブジェクトであればどのようなオブジェクトでも返すことができます:
|
130
|
+
|
131
|
+
* 3要素の配列: <tt>[ステータス(Fixnum), ヘッダ(Hash), レスポンスボディ(#eachに応答する)]</tt>
|
132
|
+
* 2要素の配列: <tt>[ステータス(Fixnum), レスポンスボディ(#eachに応答する)]</tt>
|
133
|
+
* <tt>#each</tt>に応答し、与えられたブロックに文字列を渡すオブジェクト
|
134
|
+
* ステータスコードを表現するFixnum
|
135
|
+
|
136
|
+
そのように、例えばストリーミングの例を簡単に実装することができます:
|
137
|
+
|
138
|
+
class Stream
|
139
|
+
def each
|
140
|
+
100.times { |i| yield "#{i}\n" }
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
get('/') { Stream.new }
|
145
|
+
|
146
|
+
|
92
147
|
== 静的ファイル
|
93
148
|
|
94
149
|
静的ファイルは<tt>./public</tt>ディレクトリから配信されます。
|
@@ -123,7 +178,7 @@ hamlを使うにはhamlライブラリが必要です:
|
|
123
178
|
|
124
179
|
<tt>./views/index.haml</tt>を表示します。
|
125
180
|
|
126
|
-
{Haml's options}[http://haml.
|
181
|
+
{Haml's options}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
|
127
182
|
はSinatraの設定でグローバルに設定することができます。
|
128
183
|
{Options and Configurations}[http://www.sinatrarb.com/configuration.html],
|
129
184
|
を参照してそれぞれ設定を上書きして下さい。
|
@@ -146,6 +201,19 @@ hamlを使うにはhamlライブラリが必要です:
|
|
146
201
|
|
147
202
|
<tt>./views/index.erb</tt>を表示します。
|
148
203
|
|
204
|
+
=== Erubis
|
205
|
+
|
206
|
+
erubisテンプレートを表示するには、erubisライブラリが必要です:
|
207
|
+
|
208
|
+
## erubisを読み込みます
|
209
|
+
require 'erubis'
|
210
|
+
|
211
|
+
get '/' do
|
212
|
+
erubis :index
|
213
|
+
end
|
214
|
+
|
215
|
+
<tt>./views/index.erubis</tt>を表示します。
|
216
|
+
|
149
217
|
=== Builder テンプレート
|
150
218
|
|
151
219
|
builderを使うにはbuilderライブラリが必要です:
|
@@ -154,12 +222,24 @@ builderを使うにはbuilderライブラリが必要です:
|
|
154
222
|
require 'builder'
|
155
223
|
|
156
224
|
get '/' do
|
157
|
-
content_type 'application/xml', :charset => 'utf-8'
|
158
225
|
builder :index
|
159
226
|
end
|
160
227
|
|
161
228
|
<tt>./views/index.builder</tt>を表示します。
|
162
229
|
|
230
|
+
=== 鋸 テンプレート
|
231
|
+
|
232
|
+
鋸を使うには鋸ライブラリが必要です:
|
233
|
+
|
234
|
+
## 鋸を読み込みます
|
235
|
+
require 'nokogiri'
|
236
|
+
|
237
|
+
get '/' do
|
238
|
+
nokogiri :index
|
239
|
+
end
|
240
|
+
|
241
|
+
<tt>./views/index.nokogiri</tt>を表示します。
|
242
|
+
|
163
243
|
=== Sass テンプレート
|
164
244
|
|
165
245
|
Sassテンプレートを使うにはsassライブラリが必要です:
|
@@ -168,13 +248,12 @@ Sassテンプレートを使うにはsassライブラリが必要です:
|
|
168
248
|
require 'sass'
|
169
249
|
|
170
250
|
get '/stylesheet.css' do
|
171
|
-
content_type 'text/css', :charset => 'utf-8'
|
172
251
|
sass :stylesheet
|
173
252
|
end
|
174
253
|
|
175
254
|
<tt>./views/stylesheet.sass</tt>を表示します。
|
176
255
|
|
177
|
-
{Sass' options}[http://
|
256
|
+
{Sass' options}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
|
178
257
|
はSinatraの設定でグローバルに設定することができます。
|
179
258
|
see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
|
180
259
|
を参照してそれぞれ設定を上書きして下さい。
|
@@ -182,10 +261,176 @@ see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
|
|
182
261
|
set :sass, {:style => :compact } # デフォルトのSass styleは :nested
|
183
262
|
|
184
263
|
get '/stylesheet.css' do
|
185
|
-
content_type 'text/css', :charset => 'utf-8'
|
186
264
|
sass :stylesheet, :sass_options => {:style => :expanded } # 上書き
|
187
265
|
end
|
188
266
|
|
267
|
+
=== Scss テンプレート
|
268
|
+
|
269
|
+
Scssテンプレートを使うにはsassライブラリが必要です:
|
270
|
+
|
271
|
+
## hamlかsassを読み込みます
|
272
|
+
require 'sass'
|
273
|
+
|
274
|
+
get '/stylesheet.css' do
|
275
|
+
scss :stylesheet
|
276
|
+
end
|
277
|
+
|
278
|
+
<tt>./views/stylesheet.scss</tt>を表示します。
|
279
|
+
|
280
|
+
{Sass' options}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
|
281
|
+
はSinatraの設定でグローバルに設定することができます。
|
282
|
+
see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
|
283
|
+
を参照してそれぞれ設定を上書きして下さい。
|
284
|
+
|
285
|
+
set :scss, :style => :compact # デフォルトのScss styleは:nested
|
286
|
+
|
287
|
+
get '/stylesheet.css' do
|
288
|
+
scss :stylesheet, :style => :expanded # 上書き
|
289
|
+
end
|
290
|
+
|
291
|
+
=== Less テンプレート
|
292
|
+
|
293
|
+
Lessテンプレートを使うにはlessライブラリが必要です:
|
294
|
+
|
295
|
+
## lessを読み込みます
|
296
|
+
require 'less'
|
297
|
+
|
298
|
+
get '/stylesheet.css' do
|
299
|
+
less :stylesheet
|
300
|
+
end
|
301
|
+
|
302
|
+
<tt>./views/stylesheet.less</tt>を表示します。
|
303
|
+
|
304
|
+
=== Liquid テンプレート
|
305
|
+
|
306
|
+
Liquidテンプレートを使うにはliquidライブラリが必要です:
|
307
|
+
|
308
|
+
## liquidを読み込みます
|
309
|
+
require 'liquid'
|
310
|
+
|
311
|
+
get '/' do
|
312
|
+
liquid :index
|
313
|
+
end
|
314
|
+
|
315
|
+
<tt>./views/index.liquid</tt>を表示します。
|
316
|
+
|
317
|
+
LiquidテンプレートからRubyのメソッド(+yield+を除く)を呼び出すことができないため、
|
318
|
+
ほぼ全ての場合にlocalsを指定する必要があるでしょう:
|
319
|
+
|
320
|
+
liquid :index, :locals => { :key => 'value' }
|
321
|
+
|
322
|
+
=== Markdown テンプレート
|
323
|
+
|
324
|
+
Markdownテンプレートを使うにはrdiscountライブラリが必要です:
|
325
|
+
|
326
|
+
## rdiscountを読み込みます
|
327
|
+
require "rdiscount"
|
328
|
+
|
329
|
+
get '/' do
|
330
|
+
markdown :index
|
331
|
+
end
|
332
|
+
|
333
|
+
<tt>./views/index.markdown</tt>を表示します。(+md+と+mkd+も妥当な拡張子です)
|
334
|
+
|
335
|
+
markdownからメソッドを呼び出すことも、localsに変数を渡すこともできません。
|
336
|
+
それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です:
|
337
|
+
|
338
|
+
erb :overview, :locals => { :text => markdown(:introduction) }
|
339
|
+
|
340
|
+
他のテンプレートからmarkdownメソッドを呼び出してもよいことに注意してください:
|
341
|
+
|
342
|
+
%h1 Hello From Haml!
|
343
|
+
%p= markdown(:greetings)
|
344
|
+
|
345
|
+
=== Textile テンプレート
|
346
|
+
|
347
|
+
Textileテンプレートを使うにはRedClothライブラリが必要です:
|
348
|
+
|
349
|
+
## redclothを読み込みます
|
350
|
+
require "redcloth"
|
351
|
+
|
352
|
+
get '/' do
|
353
|
+
textile :index
|
354
|
+
end
|
355
|
+
|
356
|
+
<tt>./views/index.textile</tt>を表示します。
|
357
|
+
|
358
|
+
textileからメソッドを呼び出すことも、localsに変数を渡すこともできません。
|
359
|
+
それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です:
|
360
|
+
|
361
|
+
erb :overview, :locals => { :text => textile(:introduction) }
|
362
|
+
|
363
|
+
他のテンプレートからtextileメソッドを呼び出してもよいことに注意してください:
|
364
|
+
|
365
|
+
%h1 Hello From Haml!
|
366
|
+
%p= textile(:greetings)
|
367
|
+
|
368
|
+
=== RDoc テンプレート
|
369
|
+
|
370
|
+
RDocテンプレートを使うにはRDocライブラリが必要です:
|
371
|
+
|
372
|
+
## rdocを読み込みます
|
373
|
+
require "rdoc"
|
374
|
+
|
375
|
+
get '/' do
|
376
|
+
rdoc :index
|
377
|
+
end
|
378
|
+
|
379
|
+
<tt>./views/index.rdoc</tt>を表示します。
|
380
|
+
|
381
|
+
rdocからメソッドを呼び出すことも、localsに変数を渡すこともできません。
|
382
|
+
それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です:
|
383
|
+
|
384
|
+
erb :overview, :locals => { :text => rdoc(:introduction) }
|
385
|
+
|
386
|
+
他のテンプレートからrdocメソッドを呼び出してもよいことに注意してください:
|
387
|
+
|
388
|
+
%h1 Hello From Haml!
|
389
|
+
%p= rdoc(:greetings)
|
390
|
+
|
391
|
+
=== Radius テンプレート
|
392
|
+
|
393
|
+
Radiusテンプレートを使うにはradiusライブラリが必要です:
|
394
|
+
|
395
|
+
## radiusを読み込みます
|
396
|
+
require 'radius'
|
397
|
+
|
398
|
+
get '/' do
|
399
|
+
radius :index
|
400
|
+
end
|
401
|
+
|
402
|
+
<tt>./views/index.radius</tt>を表示します。
|
403
|
+
|
404
|
+
RadiusテンプレートからRubyのメソッド(+yield+を除く)を呼び出すことができないため、
|
405
|
+
ほぼ全ての場合にlocalsを指定する必要があるでしょう:
|
406
|
+
|
407
|
+
radius :index, :locals => { :key => 'value' }
|
408
|
+
|
409
|
+
=== Markaby テンプレート
|
410
|
+
|
411
|
+
Markabyテンプレートを使うにはmarkabyライブラリが必要です:
|
412
|
+
|
413
|
+
## markabyを読み込みます
|
414
|
+
require 'markaby'
|
415
|
+
|
416
|
+
get '/' do
|
417
|
+
markaby :index
|
418
|
+
end
|
419
|
+
|
420
|
+
<tt>./views/index.mab</tt>を表示します。
|
421
|
+
|
422
|
+
=== CoffeeScript テンプレート
|
423
|
+
|
424
|
+
CoffeeScriptテンプレートを表示するにはcoffee-scriptライブラリと`coffee`バイナリが必要です:
|
425
|
+
|
426
|
+
## coffee-scriptを読み込みます
|
427
|
+
require 'coffee-script'
|
428
|
+
|
429
|
+
get '/application.js' do
|
430
|
+
coffee :application
|
431
|
+
end
|
432
|
+
|
433
|
+
<tt>./views/application.coffee</tt>を表示します。
|
189
434
|
|
190
435
|
=== インラインテンプレート
|
191
436
|
|
@@ -235,7 +480,7 @@ see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
|
|
235
480
|
%div.title Hello world!!!!!
|
236
481
|
|
237
482
|
注意: sinatraをrequireするファイル内で定義されたファイル内テンプレートは自動的に読み込まれます。
|
238
|
-
他のファイルで定義されているテンプレートを使うには <tt>
|
483
|
+
他のファイルで定義されているテンプレートを使うには <tt>enable :inline_templates</tt>を明示的に呼んでください。
|
239
484
|
|
240
485
|
=== 名前付きテンプレート
|
241
486
|
|
@@ -254,7 +499,7 @@ see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
|
|
254
499
|
end
|
255
500
|
|
256
501
|
「layout」というテンプレートが存在する場合、そのテンプレートファイルは他のテンプレートが
|
257
|
-
表示される度に使用されます。<tt>:layout => false</tt
|
502
|
+
表示される度に使用されます。<tt>:layout => false</tt>することでlayoutsを無効にできます。
|
258
503
|
|
259
504
|
get '/' do
|
260
505
|
haml :index, :layout => !request.xhr?
|
@@ -291,12 +536,36 @@ beforeフィルタはリクエストされたコンテキストを実行する
|
|
291
536
|
params[:splat] #=> 'bar/baz'
|
292
537
|
end
|
293
538
|
|
539
|
+
afterフィルタは同じコンテキストにあるリクエストの後に評価され、
|
540
|
+
同じくリクエストとレスポンスを変更することができます。
|
541
|
+
beforeフィルタとルートで設定されたインスタンス変数は、
|
542
|
+
afterフィルタからアクセスすることができます:
|
543
|
+
|
544
|
+
after do
|
545
|
+
puts response.status
|
546
|
+
end
|
547
|
+
|
548
|
+
フィルタにはオプションとしてパターンを渡すことができ、
|
549
|
+
この場合はリクエストのパスがパターンにマッチした場合のみフィルタが評価されます:
|
550
|
+
|
551
|
+
before '/protected/*' do
|
552
|
+
authenticate!
|
553
|
+
end
|
554
|
+
|
555
|
+
after '/create/:slug' do |slug|
|
556
|
+
session[:last_slug] = slug
|
557
|
+
end
|
558
|
+
|
294
559
|
== 強制終了
|
295
560
|
|
296
561
|
ルートかbeforeフィルタ内で直ちに実行を終了する方法:
|
297
562
|
|
298
563
|
halt
|
299
564
|
|
565
|
+
ステータスを指定することができます:
|
566
|
+
|
567
|
+
halt 410
|
568
|
+
|
300
569
|
body部を指定することもできます ...
|
301
570
|
|
302
571
|
halt 'ここにbodyを書く'
|
@@ -305,6 +574,10 @@ body部を指定することもできます ...
|
|
305
574
|
|
306
575
|
halt 401, '立ち去れ!'
|
307
576
|
|
577
|
+
ヘッダを指定:
|
578
|
+
|
579
|
+
halt 402, {'Content-Type' => 'text/plain'}, 'リベンジ'
|
580
|
+
|
308
581
|
== パッシング(Passing)
|
309
582
|
|
310
583
|
ルートは<tt>pass</tt>を使って次のルートに飛ばすことができます:
|
@@ -321,6 +594,53 @@ body部を指定することもできます ...
|
|
321
594
|
ルートブロックからすぐに抜け出し、次にマッチするルートを実行します。
|
322
595
|
マッチするルートが見当たらない場合は404が返されます。
|
323
596
|
|
597
|
+
== リクエストオブジェクトへのアクセス
|
598
|
+
|
599
|
+
受信するリクエストオブジェクトは、`request`メソッドを通じてリクエストレベル(フィルタ、ルート、エラーハンドラ)からアクセスすることができます:
|
600
|
+
|
601
|
+
# アプリケーションが http://example.com/example で動作している場合
|
602
|
+
get '/foo' do
|
603
|
+
request.body # クライアントによって送信されたリクエストボディ(下記参照)
|
604
|
+
request.scheme # "http"
|
605
|
+
request.script_name # "/example"
|
606
|
+
request.path_info # "/foo"
|
607
|
+
request.port # 80
|
608
|
+
request.request_method # "GET"
|
609
|
+
request.query_string # ""
|
610
|
+
request.content_length # request.bodyの長さ
|
611
|
+
request.media_type # request.bodyのメディアタイプ
|
612
|
+
request.host # "example.com"
|
613
|
+
request.get? # true (他の動詞についても同様のメソッドあり)
|
614
|
+
request.form_data? # false
|
615
|
+
request["SOME_HEADER"] # SOME_HEADERヘッダの値
|
616
|
+
request.referer # クライアントのリファラまたは'/'
|
617
|
+
request.user_agent # ユーザエージェント (:agent 条件によって使用される)
|
618
|
+
request.cookies # ブラウザクッキーのハッシュ
|
619
|
+
request.xhr? # Ajaxリクエストかどうか
|
620
|
+
request.url # "http://example.com/example/foo"
|
621
|
+
request.path # "/example/foo"
|
622
|
+
request.ip # クライアントのIPアドレス
|
623
|
+
request.secure? # false
|
624
|
+
request.env # Rackによって渡された生のenvハッシュ
|
625
|
+
end
|
626
|
+
|
627
|
+
<tt>script_name</tt>や<tt>path_info</tt>などのオプションは次のように利用することもできます:
|
628
|
+
|
629
|
+
before { request.path_info = "/" }
|
630
|
+
|
631
|
+
get "/" do
|
632
|
+
"全てのリクエストはここに来る"
|
633
|
+
end
|
634
|
+
|
635
|
+
<tt>request.body</tt>はIOまたはStringIOのオブジェクトです:
|
636
|
+
|
637
|
+
post "/api" do
|
638
|
+
request.body.rewind # 既に読まれているときのため
|
639
|
+
data = JSON.parse request.body.read
|
640
|
+
"Hello #{data['name']}!"
|
641
|
+
end
|
642
|
+
|
643
|
+
|
324
644
|
== 設定
|
325
645
|
|
326
646
|
どの環境でも起動時に1回だけ実行されます。
|
@@ -329,13 +649,13 @@ body部を指定することもできます ...
|
|
329
649
|
...
|
330
650
|
end
|
331
651
|
|
332
|
-
|
652
|
+
環境(RACK_ENV環境変数)が<tt>:production</tt>に設定されている時だけ実行する方法:
|
333
653
|
|
334
654
|
configure :production do
|
335
655
|
...
|
336
656
|
end
|
337
657
|
|
338
|
-
|
658
|
+
環境が<tt>:production</tt>か<tt>:test</tt>の場合に設定する方法:
|
339
659
|
|
340
660
|
configure :production, :test do
|
341
661
|
...
|
@@ -358,7 +678,7 @@ body部を指定することもできます ...
|
|
358
678
|
=== エラー
|
359
679
|
|
360
680
|
+error+ ハンドラーはルートブロックかbeforeフィルタ内で例外が発生した時はいつでも発動します。
|
361
|
-
|
681
|
+
例外オブジェクトはRack変数<tt>sinatra.error</tt>から取得できます。
|
362
682
|
|
363
683
|
error do
|
364
684
|
'エラーが発生しました。 - ' + env['sinatra.error'].name
|
@@ -380,6 +700,23 @@ block or before filter. 例外オブジェクトはRack変数<tt>sinatra.error</
|
|
380
700
|
|
381
701
|
エラーメッセージ... 何かがまずかったようです
|
382
702
|
|
703
|
+
あるいは、ステータスコードに対応するエラーハンドラを設定することもできます:
|
704
|
+
|
705
|
+
error 403 do
|
706
|
+
'Access forbidden'
|
707
|
+
end
|
708
|
+
|
709
|
+
get '/secret' do
|
710
|
+
403
|
711
|
+
end
|
712
|
+
|
713
|
+
範囲指定もできます:
|
714
|
+
|
715
|
+
error 400..510 do
|
716
|
+
'Boom'
|
717
|
+
end
|
718
|
+
|
719
|
+
|
383
720
|
開発環境として実行している場合、Sinatraは特別な<tt>not_found</tt>と<tt>error</tt>ハンドラーを
|
384
721
|
インストールしています。
|
385
722
|
|
@@ -390,6 +727,10 @@ block or before filter. 例外オブジェクトはRack変数<tt>sinatra.error</
|
|
390
727
|
|
391
728
|
mime_type :foo, 'text/foo'
|
392
729
|
|
730
|
+
これはcontent_typeヘルパで利用することができます:
|
731
|
+
|
732
|
+
content_type :foo
|
733
|
+
|
393
734
|
== Rackミドルウェア
|
394
735
|
|
395
736
|
SinatraはRack[http://rack.rubyforge.org/]というRubyのWEBフレームワーク用の
|
@@ -496,16 +837,133 @@ Sinatra::Baseのサブクラスで使えるメソッドはトップレベルのD
|
|
496
837
|
{Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1064]
|
497
838
|
{included into the main namespace}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/main.rb#L25].
|
498
839
|
|
840
|
+
=== Sinatraをミドルウェアとして利用する
|
841
|
+
|
842
|
+
Sinatraは他のRackミドルウェアを利用することができるだけでなく、
|
843
|
+
全てのSinatraアプリケーションは、それ自体ミドルウェアとして別のRackエンドポイントの前に追加することが可能です。
|
844
|
+
|
845
|
+
このエンドポイントには、別のSinatraアプリケーションまたは他のRackベースのアプリケーション(Rails/Ramaze/Camping/...)が用いられるでしょう。
|
846
|
+
|
847
|
+
require 'sinatra/base'
|
848
|
+
|
849
|
+
class LoginScreen < Sinatra::Base
|
850
|
+
enable :session
|
851
|
+
|
852
|
+
get('/login') { haml :login }
|
853
|
+
|
854
|
+
post('/login') do
|
855
|
+
if params[:name] = 'admin' and params[:password] = 'admin'
|
856
|
+
session['user_name'] = params[:name]
|
857
|
+
else
|
858
|
+
redirect '/login'
|
859
|
+
end
|
860
|
+
end
|
861
|
+
end
|
862
|
+
|
863
|
+
class MyApp < Sinatra::Base
|
864
|
+
# middleware will run before filters
|
865
|
+
use LoginScreen
|
866
|
+
|
867
|
+
before do
|
868
|
+
unless session['user_name']
|
869
|
+
halt "Access denied, please <a href='/login'>login</a>."
|
870
|
+
end
|
871
|
+
end
|
872
|
+
|
873
|
+
get('/') { "Hello #{session['user_name']}." }
|
874
|
+
end
|
875
|
+
|
876
|
+
== スコープとバインディング
|
877
|
+
|
878
|
+
現在のスコープはどのメソッドや変数が利用可能かを決定します。
|
879
|
+
|
880
|
+
=== アプリケーション/クラスのスコープ
|
881
|
+
|
882
|
+
全てのSinatraアプリケーションはSinatra::Baseのサブクラスに相当します。
|
883
|
+
もしトップレベルDSLを利用しているならば(<tt>require 'sinatra'</tt>)このクラスはSinatra::Applicationであり、
|
884
|
+
そうでなければ、あなたが明示的に作成したサブクラスです。
|
885
|
+
クラスレベルでは`get`や`before`のようなメソッドを持っています。
|
886
|
+
しかし`request`オブジェクトや`session`には、全てのリクエストのために1つのアプリケーションクラスが存在するためアクセスできません。
|
887
|
+
|
888
|
+
`set`によって作られたオプションはクラスレベルのメソッドです:
|
889
|
+
|
890
|
+
class MyApp < Sinatra::Base
|
891
|
+
# Hey, I'm in the application scope!
|
892
|
+
set :foo, 42
|
893
|
+
foo # => 42
|
894
|
+
|
895
|
+
get '/foo' do
|
896
|
+
# Hey, I'm no longer in the application scope!
|
897
|
+
end
|
898
|
+
end
|
899
|
+
|
900
|
+
次の場所ではアプリケーションスコープバインディングを持ちます:
|
901
|
+
|
902
|
+
* アプリケーションのクラス本体
|
903
|
+
* 拡張によって定義されたメソッド
|
904
|
+
* `helpers`に渡されたブロック
|
905
|
+
* `set`の値として使われるProcまたはブロック
|
906
|
+
|
907
|
+
このスコープオブジェクト(クラス)は次のように利用できます:
|
908
|
+
|
909
|
+
* configureブロックに渡されたオブジェクト経由(<tt>configure { |c| ... }</tt>)
|
910
|
+
* リクエストスコープの中での`settings`
|
911
|
+
|
912
|
+
=== リクエスト/インスタンスのスコープ
|
913
|
+
|
914
|
+
やってくるリクエストごとに、あなたのアプリケーションクラスの新しいインスタンスが作成され、全てのハンドラブロックがそのスコープで実行されます。
|
915
|
+
このスコープの内側からは`request`や`session`オブジェクトにアクセスすることができ、`erb`や`haml`のような表示メソッドを呼び出すことができます。
|
916
|
+
リクエストスコープの内側からは、`settings`ヘルパによってアプリケーションスコープにアクセスすることができます。
|
917
|
+
|
918
|
+
class MyApp << Sinatra::Base
|
919
|
+
# Hey, I'm in the application scope!
|
920
|
+
get '/define_route/:name' do
|
921
|
+
# Request scope for '/define_route/:name'
|
922
|
+
@value = 42
|
923
|
+
|
924
|
+
settings.get("/#{params[:name]}") do
|
925
|
+
# Request scope for "/#{params[:name]}"
|
926
|
+
@value # => nil (not the same request)
|
927
|
+
end
|
928
|
+
|
929
|
+
"Route defined!"
|
930
|
+
end
|
931
|
+
end
|
932
|
+
|
933
|
+
次の場所ではリクエストスコープバインディングを持ちます:
|
934
|
+
|
935
|
+
* get/head/post/put/delete ブロック
|
936
|
+
* before/after フィルタ
|
937
|
+
* helper メソッド
|
938
|
+
* テンプレート/ビュー
|
939
|
+
|
940
|
+
=== デリゲートスコープ
|
941
|
+
|
942
|
+
デリゲートスコープは、単にクラススコープにメソッドを転送します。
|
943
|
+
しかしながら、クラスのバインディングを持っていないため、クラススコープと全く同じふるまいをするわけではありません:
|
944
|
+
委譲すると明示的に示されたメソッドのみが利用可能であり、またクラススコープと変数/状態を共有することはできません(注: 異なった`self`を持っています)。
|
945
|
+
<tt>Sinatra::Delegator.delegate :method_name</tt>を呼び出すことによってデリゲートするメソッドを明示的に追加することができます。
|
946
|
+
|
947
|
+
次の場所ではデリゲートスコープを持ちます:
|
948
|
+
|
949
|
+
* もし<tt>require "sinatra"</tt>しているならば、トップレベルバインディング
|
950
|
+
* `Sinatra::Delegator` mixinでextendされたオブジェクト
|
951
|
+
|
952
|
+
コードをご覧ください: ここでは
|
953
|
+
{Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
|
954
|
+
は{main 名前空間にincludeされています}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28].
|
955
|
+
|
499
956
|
== コマンドライン
|
500
957
|
|
501
958
|
Sinatraアプリケーションは直接実行できます。
|
502
959
|
|
503
|
-
ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-s HANDLER]
|
960
|
+
ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
504
961
|
|
505
962
|
オプション:
|
506
963
|
|
507
964
|
-h # ヘルプ
|
508
965
|
-p # ポート指定(デフォルトは4567)
|
966
|
+
-o # ホスト指定(デフォルトは0.0.0.0)
|
509
967
|
-e # 環境を指定 (デフォルトはdevelopment)
|
510
968
|
-s # rackserver/handlerを指定 (デフォルトはthin)
|
511
969
|
-x # mutex lockを付ける (デフォルトはoff)
|
@@ -546,7 +1004,7 @@ Sinatraのソースを更新する方法:
|
|
546
1004
|
ニュース、他のリソースへのリンクがあります。
|
547
1005
|
* {プロジェクトに参加(貢献)する}[http://sinatra.github.com/contributing.html] - バグレポート
|
548
1006
|
パッチの送信、サポートなど
|
549
|
-
* {
|
1007
|
+
* {Issue tracker}[http://github.com/sinatra/sinatra/issues] - チケット管理とリリース計画
|
550
1008
|
* {Twitter}[http://twitter.com/sinatra]
|
551
1009
|
* {メーリングリスト}[http://groups.google.com/group/sinatrarb]
|
552
1010
|
* {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] on http://freenode.net
|