Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 1043 lines (702 sloc) 33.895 kb
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
1 = Sinatra
1abac321 » rkh
2010-09-22 Add note to all README translations saying: 'Important Note: This doc…
2 <i>注) 本文書は英語から翻訳したものであり、その内容が最新でない場合もあります。最新の情報はオリジナルの英語版を参照して下さい。</i>
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
3
4 SinatraはRubyで下記のような最小労力で手早くウェブアプリケーションを作成するためのDSLです。
5
6 # myapp.rb
7 require 'sinatra'
8 get '/' do
9 'Hello world!'
10 end
11
12 gemをインストールして動かしてみる。
13
8465d492 » rkh
2010-09-07 Avoid `require "rubygems"` and `sudo` in README.
14 gem install sinatra
15 ruby -rubygems myapp.rb
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
16
17 http://localhost:4567 を見る。
18
19 == ルート
20
21 Sinatraでは、ルートはHTTPメソッドとURLマッチングパターンがペアになっています。
22 ルートはブロックに結び付けられています。
23
24 get '/' do
25 .. 何か見せる ..
26 end
27
28 post '/' do
29 .. 何か生成する ..
30 end
31
32 put '/' do
33 .. 何か更新する ..
34 end
35
36 delete '/' do
37 .. 何か削除する ..
38 end
39
40 ルートは定義された順番にマッチします。 リクエストに最初にマッチしたルートが呼び出されます。
41
42 ルートのパターンは名前付きパラメータを含むことができ、
43 <tt>params</tt>ハッシュで取得できます。
44
45 get '/hello/:name' do
46 # matches "GET /hello/foo" and "GET /hello/bar"
47 # params[:name] is 'foo' or 'bar'
48 "Hello #{params[:name]}!"
49 end
50
51 また、ブロックパラメータで名前付きパラメータにアクセスすることもできます。
52
53 get '/hello/:name' do |n|
54 "Hello #{n}!"
55 end
56
57 ルートパターンはsplat(またはワイルドカード)を含むこともでき、
58 <tt>params[:splat]</tt> で取得できます。
59
60 get '/say/*/to/*' do
61 # matches /say/hello/to/world
62 params[:splat] # => ["hello", "world"]
63 end
64
65 get '/download/*.*' do
66 # matches /download/path/to/file.xml
67 params[:splat] # => ["path/to/file", "xml"]
68 end
69
a44f3383 » ishikawa
2011-05-18 Added wildcard pattern with block parameters in README (ja)
70 ブロックパラーメータを使用した場合:
71
72 get '/download/*.*' do |path, ext|
73 [path, ext] # => ["path/to/file", "xml"]
74 end
75
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
76 正規表現を使ったルート:
77
78 get %r{/hello/([\w]+)} do
79 "Hello, #{params[:captures].first}!"
80 end
81
82 ブロックパラーメータを使用した場合:
83
84 get %r{/hello/([\w]+)} do |c|
85 "Hello, #{c}!"
86 end
87
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
88
89 === 条件
90
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
91 ルートにはユーザエージェントのようなさまざまな条件を含めることができます。
92
93 get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
94 "You're using Songbird version #{params[:agent][0]}"
95 end
96
97 get '/foo' do
98 # Matches non-songbird browsers
99 end
100
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
101 ほかに+host_name+と+provides+条件が利用可能です:
102
103 get '/', :host_name => /^admin\./ do
104 "Admin Area, Access denied!"
105 end
106
107 get '/', :provides => 'html' do
108 haml :index
109 end
110
111 get '/', :provides => ['rss', 'atom', 'xml'] do
112 builder :feed
113 end
114
115 独自の条件を定義することも簡単にできます:
116
117 set(:probability) { |value| condition { rand <= value } }
118
119 get '/win_a_car', :probability => 0.1 do
120 "You won!"
121 end
122
123 get '/win_a_car' do
124 "Sorry, you lost."
125 end
126
127
128 === 戻り値
129
130 ルートブロックの戻り値は、HTTPクライアントまたはRackスタックでの次のミドルウェアに渡されるレスポンスボディを決定します。
131
132 これは大抵の場合、上の例のように文字列ですが、それ以外の値も使用することができます。
133
134 Rackレスポンス、Rackボディオブジェクト、HTTPステータスコードのいずれかとして
135 妥当なオブジェクトであればどのようなオブジェクトでも返すことができます:
136
137 * 3要素の配列: <tt>[ステータス(Fixnum), ヘッダ(Hash), レスポンスボディ(#eachに応答する)]</tt>
138 * 2要素の配列: <tt>[ステータス(Fixnum), レスポンスボディ(#eachに応答する)]</tt>
139 * <tt>#each</tt>に応答し、与えられたブロックに文字列を渡すオブジェクト
140 * ステータスコードを表現するFixnum
141
142 そのように、例えばストリーミングの例を簡単に実装することができます:
143
144 class Stream
145 def each
146 100.times { |i| yield "#{i}\n" }
147 end
148 end
149
150 get('/') { Stream.new }
151
152
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
153 == 静的ファイル
154
155 静的ファイルは<tt>./public</tt>ディレクトリから配信されます。
d1ab58de » rkh
2011-06-16 rename public to public_folder, fixes #301
156 <tt>:public_folder</tt>オプションを指定することで別の場所を指定することができます。
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
157
d1ab58de » rkh
2011-06-16 rename public to public_folder, fixes #301
158 set :public_folder, File.dirname(__FILE__) + '/static'
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
159
160 注意: この静的ファイル用のディレクトリ名はURL中に含まれません。
161 例えば、<tt>./public/css/style.css</tt>は<tt>http://example.com/css/style.css</tt>でアクセスできます。
162
163 == ビュー / テンプレート
164
165 テンプレートは<tt>./views</tt>ディレクトリ下に配置されています。
166 他のディレクトリを使用する場合の例:
167
168 set :views, File.dirname(__FILE__) + '/templates'
169
170 テンプレートはシンボルを使用して参照させることを覚えておいて下さい。
171 サブデレクトリでもこの場合は<tt>:'subdir/template'</tt>のようにします。
172 レンダリングメソッドは文字列が渡されると、そのまま文字列を出力します。
173
174 === Haml テンプレート
175
176 hamlを使うにはhamlライブラリが必要です:
177
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
178 # hamlを読み込みます
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
179 require 'haml'
180
181 get '/' do
182 haml :index
183 end
184
185 <tt>./views/index.haml</tt>を表示します。
186
bdab3808 » dougireton
2010-05-26 In Japanese README doc, fix links to HAML and SASS Options pages.
187 {Haml's options}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
188 はSinatraの設定でグローバルに設定することができます。
189 {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
190 を参照してそれぞれ設定を上書きして下さい。
191
192 set :haml, {:format => :html5 } # デフォルトのフォーマットは:xhtml
193
194 get '/' do
195 haml :index, :haml_options => {:format => :html4 } # 上書き
196 end
197
198
199 === Erb テンプレート
200
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
201 # erbを読み込みます
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
202 require 'erb'
203
204 get '/' do
205 erb :index
206 end
207
208 <tt>./views/index.erb</tt>を表示します。
209
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
210 === Erubis
211
212 erubisテンプレートを表示するには、erubisライブラリが必要です:
213
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
214 # erubisを読み込みます
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
215 require 'erubis'
216
217 get '/' do
218 erubis :index
219 end
220
221 <tt>./views/index.erubis</tt>を表示します。
222
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
223 === Builder テンプレート
224
225 builderを使うにはbuilderライブラリが必要です:
226
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
227 # builderを読み込みます
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
228 require 'builder'
229
230 get '/' do
231 builder :index
232 end
233
234 <tt>./views/index.builder</tt>を表示します。
235
dd81da11 » rkh
2010-10-10 Add nokogiri helper method. Tilt supports Nokogiri for quite some tim…
236 === 鋸 テンプレート
237
238 鋸を使うには鋸ライブラリが必要です:
239
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
240 # 鋸を読み込みます
dd81da11 » rkh
2010-10-10 Add nokogiri helper method. Tilt supports Nokogiri for quite some tim…
241 require 'nokogiri'
242
243 get '/' do
244 nokogiri :index
245 end
246
247 <tt>./views/index.nokogiri</tt>を表示します。
248
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
249 === Sass テンプレート
250
251 Sassテンプレートを使うにはsassライブラリが必要です:
252
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
253 # hamlかsassを読み込みます
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
254 require 'sass'
255
256 get '/stylesheet.css' do
257 sass :stylesheet
258 end
259
260 <tt>./views/stylesheet.sass</tt>を表示します。
261
bdab3808 » dougireton
2010-05-26 In Japanese README doc, fix links to HAML and SASS Options pages.
262 {Sass' options}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
263 はSinatraの設定でグローバルに設定することができます。
264 see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
265 を参照してそれぞれ設定を上書きして下さい。
266
267 set :sass, {:style => :compact } # デフォルトのSass styleは :nested
268
269 get '/stylesheet.css' do
270 sass :stylesheet, :sass_options => {:style => :expanded } # 上書き
271 end
272
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
273 === Scss テンプレート
274
275 Scssテンプレートを使うにはsassライブラリが必要です:
276
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
277 # hamlかsassを読み込みます
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
278 require 'sass'
279
280 get '/stylesheet.css' do
281 scss :stylesheet
282 end
283
284 <tt>./views/stylesheet.scss</tt>を表示します。
285
286 {Sass' options}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
287 はSinatraの設定でグローバルに設定することができます。
288 see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
289 を参照してそれぞれ設定を上書きして下さい。
290
291 set :scss, :style => :compact # デフォルトのScss styleは:nested
292
293 get '/stylesheet.css' do
294 scss :stylesheet, :style => :expanded # 上書き
295 end
296
297 === Less テンプレート
298
299 Lessテンプレートを使うにはlessライブラリが必要です:
300
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
301 # lessを読み込みます
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
302 require 'less'
303
304 get '/stylesheet.css' do
305 less :stylesheet
306 end
307
308 <tt>./views/stylesheet.less</tt>を表示します。
309
310 === Liquid テンプレート
311
312 Liquidテンプレートを使うにはliquidライブラリが必要です:
313
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
314 # liquidを読み込みます
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
315 require 'liquid'
316
317 get '/' do
318 liquid :index
319 end
320
321 <tt>./views/index.liquid</tt>を表示します。
322
323 LiquidテンプレートからRubyのメソッド(+yield+を除く)を呼び出すことができないため、
324 ほぼ全ての場合にlocalsを指定する必要があるでしょう:
325
326 liquid :index, :locals => { :key => 'value' }
327
328 === Markdown テンプレート
329
330 Markdownテンプレートを使うにはrdiscountライブラリが必要です:
331
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
332 # rdiscountを読み込みます
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
333 require "rdiscount"
334
335 get '/' do
336 markdown :index
337 end
338
339 <tt>./views/index.markdown</tt>を表示します。(+md+と+mkd+も妥当な拡張子です)
340
341 markdownからメソッドを呼び出すことも、localsに変数を渡すこともできません。
342 それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です:
343
344 erb :overview, :locals => { :text => markdown(:introduction) }
345
346 他のテンプレートからmarkdownメソッドを呼び出してもよいことに注意してください:
347
348 %h1 Hello From Haml!
349 %p= markdown(:greetings)
350
351 === Textile テンプレート
352
353 Textileテンプレートを使うにはRedClothライブラリが必要です:
354
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
355 # redclothを読み込みます
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
356 require "redcloth"
357
358 get '/' do
359 textile :index
360 end
361
362 <tt>./views/index.textile</tt>を表示します。
363
364 textileからメソッドを呼び出すことも、localsに変数を渡すこともできません。
365 それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です:
366
367 erb :overview, :locals => { :text => textile(:introduction) }
368
369 他のテンプレートからtextileメソッドを呼び出してもよいことに注意してください:
370
371 %h1 Hello From Haml!
372 %p= textile(:greetings)
373
374 === RDoc テンプレート
375
376 RDocテンプレートを使うにはRDocライブラリが必要です:
377
7c186a0d » rkh
2011-02-26 require "rdoc" -> require "rdoc/markup/to_html"
378 # rdoc/markup/to_htmlを読み込みます
bee190b4 » timfel
2011-10-10 Update README's to avoid surprises when using RDoc 3.10
379 require "rdoc"
7c186a0d » rkh
2011-02-26 require "rdoc" -> require "rdoc/markup/to_html"
380 require "rdoc/markup/to_html"
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
381
382 get '/' do
383 rdoc :index
384 end
385
386 <tt>./views/index.rdoc</tt>を表示します。
387
388 rdocからメソッドを呼び出すことも、localsに変数を渡すこともできません。
389 それゆえ、他のレンダリングエンジンとの組み合わせで使うのが普通です:
390
391 erb :overview, :locals => { :text => rdoc(:introduction) }
392
393 他のテンプレートからrdocメソッドを呼び出してもよいことに注意してください:
394
395 %h1 Hello From Haml!
396 %p= rdoc(:greetings)
397
398 === Radius テンプレート
399
400 Radiusテンプレートを使うにはradiusライブラリが必要です:
401
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
402 # radiusを読み込みます
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
403 require 'radius'
404
405 get '/' do
406 radius :index
407 end
408
409 <tt>./views/index.radius</tt>を表示します。
410
411 RadiusテンプレートからRubyのメソッド(+yield+を除く)を呼び出すことができないため、
412 ほぼ全ての場合にlocalsを指定する必要があるでしょう:
413
414 radius :index, :locals => { :key => 'value' }
415
416 === Markaby テンプレート
417
418 Markabyテンプレートを使うにはmarkabyライブラリが必要です:
419
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
420 # markabyを読み込みます
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
421 require 'markaby'
422
423 get '/' do
424 markaby :index
425 end
426
427 <tt>./views/index.mab</tt>を表示します。
428
ca7fbe54 » rkh
2010-11-05 Add documentation for Slim templates.
429 === Slim テンプレート
430
431 Slimテンプレートを使うにはslimライブラリが必要です:
432
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
433 # slimを読み込みます
ca7fbe54 » rkh
2010-11-05 Add documentation for Slim templates.
434 require 'slim'
435
436 get '/' do
437 slim :index
438 end
439
440 <tt>./views/index.slim</tt>を表示します。
441
9ce9e543 » rkh
2011-04-15 add support for creole templates
442 === Creole テンプレート
443
444 Creoleテンプレートを使うにはcreoleライブラリが必要です:
445
446 # creoleを読み込みます
447 require 'creole'
448
449 get '/' do
450 creole :index
451 end
452
453 <tt>./views/index.creole</tt>を表示します。
454
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
455 === CoffeeScript テンプレート
456
457 CoffeeScriptテンプレートを表示するにはcoffee-scriptライブラリと`coffee`バイナリが必要です:
458
314a98fc » rkh
2011-01-11 Remove uneccessary # from READMEs.
459 # coffee-scriptを読み込みます
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
460 require 'coffee-script'
461
462 get '/application.js' do
463 coffee :application
464 end
465
466 <tt>./views/application.coffee</tt>を表示します。
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
467
468 === インラインテンプレート
469
470 get '/' do
471 haml '%div.title Hello World'
472 end
473
474 文字列をテンプレートとして表示します。
475
476 === テンプレート内で変数にアクセスする
477
478 テンプレートはルートハンドラと同じコンテキストの中で評価されます。. ルートハンドラでセットされたインスタンス変数は
479 テンプレート内で直接使うことができます。
480
481 get '/:id' do
482 @foo = Foo.find(params[:id])
483 haml '%h1= @foo.name'
484 end
485
486 ローカル変数を明示的に定義することもできます。
487
488 get '/:id' do
489 foo = Foo.find(params[:id])
490 haml '%h1= foo.name', :locals => { :foo => foo }
491 end
492
493 このやり方は他のテンプレート内で部分テンプレートとして表示する時に典型的に使用されます。
494
495 === ファイル内テンプレート
496
497 テンプレートはソースファイルの最後で定義することもできます。
498
499 require 'rubygems'
500 require 'sinatra'
501
502 get '/' do
503 haml :index
504 end
505
506 __END__
507
508 @@ layout
509 %html
510 = yield
511
512 @@ index
513 %div.title Hello world!!!!!
514
515 注意: sinatraをrequireするファイル内で定義されたファイル内テンプレートは自動的に読み込まれます。
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
516 他のファイルで定義されているテンプレートを使うには <tt>enable :inline_templates</tt>を明示的に呼んでください。
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
517
518 === 名前付きテンプレート
519
520 テンプレートはトップレベルの<tt>template</tt>メソッドで定義することができます。
521
522 template :layout do
523 "%html\n =yield\n"
524 end
525
526 template :index do
527 '%div.title Hello World!'
528 end
529
530 get '/' do
531 haml :index
532 end
533
534 「layout」というテンプレートが存在する場合、そのテンプレートファイルは他のテンプレートが
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
535 表示される度に使用されます。<tt>:layout => false</tt>することでlayoutsを無効にできます。
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
536
537 get '/' do
538 haml :index, :layout => !request.xhr?
539 end
540
541 == ヘルパー
542
543 トップレベルの<tt>helpers</tt>を使用してルートハンドラやテンプレートで使うヘルパメソッドを
544 定義できます。
545
546 helpers do
547 def bar(name)
548 "#{name}bar"
549 end
550 end
551
552 get '/:name' do
553 bar(params[:name])
554 end
555
556 == フィルタ
557
558 beforeフィルタはリクエストされたコンテキストを実行する前に評価され、
559 リクエストとレスポンスを変更することができます。フィルタ内でセットされた
560 インスタンス変数はルーティングとテンプレートで使用できます。
561
562 before do
563 @note = 'Hi!'
564 request.path_info = '/foo/bar/baz'
565 end
566
567 get '/foo/*' do
568 @note #=> 'Hi!'
569 params[:splat] #=> 'bar/baz'
570 end
571
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
572 afterフィルタは同じコンテキストにあるリクエストの後に評価され、
573 同じくリクエストとレスポンスを変更することができます。
574 beforeフィルタとルートで設定されたインスタンス変数は、
575 afterフィルタからアクセスすることができます:
576
577 after do
578 puts response.status
579 end
580
581 フィルタにはオプションとしてパターンを渡すことができ、
582 この場合はリクエストのパスがパターンにマッチした場合のみフィルタが評価されます:
583
584 before '/protected/*' do
585 authenticate!
586 end
587
588 after '/create/:slug' do |slug|
589 session[:last_slug] = slug
590 end
591
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
592 == 強制終了
593
594 ルートかbeforeフィルタ内で直ちに実行を終了する方法:
595
596 halt
597
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
598 ステータスを指定することができます:
599
600 halt 410
601
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
602 body部を指定することもできます ...
603
604 halt 'ここにbodyを書く'
605
606 ステータスとbody部を指定する ...
607
608 halt 401, '立ち去れ!'
609
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
610 ヘッダを指定:
611
612 halt 402, {'Content-Type' => 'text/plain'}, 'リベンジ'
613
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
614 == パッシング(Passing)
615
616 ルートは<tt>pass</tt>を使って次のルートに飛ばすことができます:
617
618 get '/guess/:who' do
619 pass unless params[:who] == 'Frank'
620 "見つかっちゃった!"
621 end
622
623 get '/guess/*' do
624 "はずれです!"
625 end
626
627 ルートブロックからすぐに抜け出し、次にマッチするルートを実行します。
628 マッチするルートが見当たらない場合は404が返されます。
629
d842c145 » kyanagi
2010-10-13 Updated Japanese README with request object documentation.
630 == リクエストオブジェクトへのアクセス
631
632 受信するリクエストオブジェクトは、`request`メソッドを通じてリクエストレベル(フィルタ、ルート、エラーハンドラ)からアクセスすることができます:
633
634 # アプリケーションが http://example.com/example で動作している場合
635 get '/foo' do
636 request.body # クライアントによって送信されたリクエストボディ(下記参照)
637 request.scheme # "http"
638 request.script_name # "/example"
639 request.path_info # "/foo"
640 request.port # 80
641 request.request_method # "GET"
642 request.query_string # ""
643 request.content_length # request.bodyの長さ
644 request.media_type # request.bodyのメディアタイプ
645 request.host # "example.com"
646 request.get? # true (他の動詞についても同様のメソッドあり)
647 request.form_data? # false
648 request["SOME_HEADER"] # SOME_HEADERヘッダの値
649 request.referer # クライアントのリファラまたは'/'
650 request.user_agent # ユーザエージェント (:agent 条件によって使用される)
651 request.cookies # ブラウザクッキーのハッシュ
652 request.xhr? # Ajaxリクエストかどうか
653 request.url # "http://example.com/example/foo"
654 request.path # "/example/foo"
655 request.ip # クライアントのIPアドレス
656 request.secure? # false
657 request.env # Rackによって渡された生のenvハッシュ
658 end
659
660 <tt>script_name</tt>や<tt>path_info</tt>などのオプションは次のように利用することもできます:
661
662 before { request.path_info = "/" }
663
664 get "/" do
665 "全てのリクエストはここに来る"
666 end
667
668 <tt>request.body</tt>はIOまたはStringIOのオブジェクトです:
669
670 post "/api" do
671 request.body.rewind # 既に読まれているときのため
672 data = JSON.parse request.body.read
673 "Hello #{data['name']}!"
674 end
675
676
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
677 == 設定
678
679 どの環境でも起動時に1回だけ実行されます。
680
681 configure do
682 ...
683 end
684
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
685 環境(RACK_ENV環境変数)が<tt>:production</tt>に設定されている時だけ実行する方法:
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
686
687 configure :production do
688 ...
689 end
690
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
691 環境が<tt>:production</tt>か<tt>:test</tt>の場合に設定する方法:
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
692
693 configure :production, :test do
694 ...
695 end
696
697 == エラーハンドリング
698
699 エラーハンドラーはルートコンテキストとbeforeフィルタ内で実行します。
700 <tt>haml</tt>、<tt>erb</tt>、<tt>halt</tt>などを使うこともできます。
701
702 === Not Found
703
704 <tt>Sinatra::NotFound</tt>が起きた時か レスポンスのステータスコードが
705 404の時に<tt>not_found</tt>ハンドラーが発動します。
706
707 not_found do
708 'ファイルが存在しません'
709 end
710
711 === エラー
712
713 +error+ ハンドラーはルートブロックかbeforeフィルタ内で例外が発生した時はいつでも発動します。
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
714 例外オブジェクトはRack変数<tt>sinatra.error</tt>から取得できます。
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
715
716 error do
717 'エラーが発生しました。 - ' + env['sinatra.error'].name
718 end
719
720 エラーをカスタマイズする場合は、
721
722 error MyCustomError do
66f12561 » rkh
2011-04-17 env is accessable directly, no need to use request.env
723 'エラーメッセージ...' + env['sinatra.error'].message
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
724 end
725
726 と書いておいて,下記のように呼び出します。
727
728 get '/' do
729 raise MyCustomError, '何かがまずかったようです'
730 end
731
732 そうするとこうなります:
733
734 エラーメッセージ... 何かがまずかったようです
735
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
736 あるいは、ステータスコードに対応するエラーハンドラを設定することもできます:
737
738 error 403 do
739 'Access forbidden'
740 end
741
742 get '/secret' do
743 403
744 end
745
746 範囲指定もできます:
747
748 error 400..510 do
749 'Boom'
750 end
751
752
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
753 開発環境として実行している場合、Sinatraは特別な<tt>not_found</tt>と<tt>error</tt>ハンドラーを
754 インストールしています。
755
756 == MIMEタイプ
757
758 <tt>send_file</tt>か静的ファイルを使う時、Sinatraが理解でいないMIMEタイプがある場合があります。
6d8b333a » sr
2009-10-18 Update README re. mime_type
759 その時は +mime_type+ を使ってファイル拡張子毎に登録して下さい。
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
760
6d8b333a » sr
2009-10-18 Update README re. mime_type
761 mime_type :foo, 'text/foo'
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
762
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
763 これはcontent_typeヘルパで利用することができます:
764
765 content_type :foo
766
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
767 == Rackミドルウェア
768
769 SinatraはRack[http://rack.rubyforge.org/]というRubyのWEBフレームワーク用の
770 最小限の標準インターフェース 上で動作しています。Rack中でもアプリケーションデベロッパー
771 向けに一番興味深い機能はミドルウェア(サーバとアプリケーション間に介在し、モニタリング、HTTPリクエストとレスポンス
772 の手動操作ができるなど、一般的な機能のいろいろなことを提供するもの)をサポートすることです。
773
774 Sinatraではトップレベルの+user+ メソッドを使ってRackにパイプラインを構築します。
775
776 require 'sinatra'
777 require 'my_custom_middleware'
778
779 use Rack::Lint
780 use MyCustomMiddleware
781
782 get '/hello' do
783 'Hello World'
784 end
785
786 <tt>use</tt> の意味は{Rack::Builder}[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] DSLで定義されていることと全て一致します。
787 例えば +use+ メソッドはブロック構文のように複数の引数を受け取ることができます。
788
789 use Rack::Auth::Basic do |username, password|
790 username == 'admin' && password == 'secret'
791 end
792
793 Rackはログ、デバッギング、URLルーティング、認証、セッションなどいろいろな機能を備えた標準的ミドルウェアです。
794 Sinatraはその多くのコンポーネントを自動で使うよう基本設定されているため、+use+で明示的に指定する必要はありません。
795
796 == テスト
797
798 SinatraでのテストはRack-basedのテストライブラリかフレームワークを使って書くことができます。
799 {Rack::Test}[http://gitrdoc.com/brynary/rack-test] をおすすめします。やり方:
800
801 require 'my_sinatra_app'
802 require 'rack/test'
803
804 class MyAppTest < Test::Unit::TestCase
805 include Rack::Test::Methods
806
807 def app
808 Sinatra::Application
809 end
810
811 def test_my_default
812 get '/'
813 assert_equal 'Hello World!', last_response.body
814 end
815
816 def test_with_params
817 get '/meet', :name => 'Frank'
818 assert_equal 'Hello Frank!', last_response.body
819 end
820
821 def test_with_rack_env
822 get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
823 assert_equal "あなたはSongbirdを使ってますね!", last_response.body
824 end
825 end
826
827 注意: ビルトインのSinatra::TestモジュールとSinatra::TestHarnessクラスは
828 0.9.2リリース以降、廃止予定になっています。
829
830 == Sinatra::Base - ミドルウェア、ライブラリ、 モジュラーアプリ
831
832 トップレベル(グローバル領域)上でいろいろ定義していくのは軽量アプリならうまくいきますが、
833 RackミドルウェアやRails metal、サーバのコンポーネントを含んだシンプルな
834 ライブラリやSinatraの拡張プログラムを考慮するような場合はそうとは限りません。
835 トップレベルのDSLがネームスペースを汚染したり、設定を変えてしまうこと(例:./publicや./view)がありえます。
836 そこでSinatra::Baseの出番です。
837
838 require 'sinatra/base'
839
840 class MyApp < Sinatra::Base
841 set :sessions, true
842 set :foo, 'bar'
843
844 get '/' do
845 'Hello world!'
846 end
847 end
848
849 このMyAppは独立したRackコンポーネントで、RackミドルウェアやRackアプリケーション
850 Rails metalとして使用することができます。<tt>config.ru</tt>ファイル内で +use+ か、または
851 +run+ でこのクラスを指定するか、ライブラリとしてサーバコンポーネントをコントロールします。
852
853 MyApp.run! :host => 'localhost', :port => 9090
854
855 Sinatra::Baseのサブクラスで使えるメソッドはトップレベルのDSLを経由して確実に使うことができます。
856 ほとんどのトップレベルで記述されたアプリは、以下の2点を修正することでSinatra::Baseコンポーネントに変えることができます。
857
858 * +sinatra+の代わりに<tt>sinatra/base</tt>を読み込む
859 (そうしない場合、SinatraのDSLメソッドの全てがメインネームスペースにインポートされます)
860 * ルート、エラーハンドラー、フィルター、オプションをSinatra::Baseのサブクラスに書く
861
862 <tt>Sinatra::Base</tt> はまっさらです。ビルトインサーバを含む、ほとんどのオプションがデフォルト
863 で無効になっています。オプション詳細については{Options and Configuration}[http://sinatra.github.com/configuration.html]
864 をご覧下さい。
865
866 補足: SinatraのトップレベルDSLはシンプルな委譲(delgation)システムで実装されています。
867 <tt>Sinatra::Application</tt>クラス(Sinatra::Baseの特別なサブクラス)は、トップレベルに送られる
868 :get、 :put、 :post、:delete、 :before、:error、:not_found、 :configure、:set messagesのこれら
869 全てを受け取ります。 詳細を閲覧されたい方はこちら(英語):
870 {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1064]
871 {included into the main namespace}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/main.rb#L25].
872
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
873 === Sinatraをミドルウェアとして利用する
874
875 Sinatraは他のRackミドルウェアを利用することができるだけでなく、
876 全てのSinatraアプリケーションは、それ自体ミドルウェアとして別のRackエンドポイントの前に追加することが可能です。
877
878 このエンドポイントには、別のSinatraアプリケーションまたは他のRackベースのアプリケーション(Rails/Ramaze/Camping/...)が用いられるでしょう。
879
880 require 'sinatra/base'
881
882 class LoginScreen < Sinatra::Base
e6887fe4 » andrewhampton
2010-11-07 Fix typo in middleware example.
883 enable :sessions
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
884
885 get('/login') { haml :login }
886
887 post('/login') do
888 if params[:name] = 'admin' and params[:password] = 'admin'
889 session['user_name'] = params[:name]
890 else
891 redirect '/login'
892 end
893 end
894 end
895
896 class MyApp < Sinatra::Base
897 # middleware will run before filters
898 use LoginScreen
899
900 before do
901 unless session['user_name']
902 halt "Access denied, please <a href='/login'>login</a>."
903 end
904 end
905
906 get('/') { "Hello #{session['user_name']}." }
907 end
908
909 == スコープとバインディング
910
911 現在のスコープはどのメソッドや変数が利用可能かを決定します。
912
913 === アプリケーション/クラスのスコープ
914
915 全てのSinatraアプリケーションはSinatra::Baseのサブクラスに相当します。
916 もしトップレベルDSLを利用しているならば(<tt>require 'sinatra'</tt>)このクラスはSinatra::Applicationであり、
917 そうでなければ、あなたが明示的に作成したサブクラスです。
918 クラスレベルでは`get`や`before`のようなメソッドを持っています。
919 しかし`request`オブジェクトや`session`には、全てのリクエストのために1つのアプリケーションクラスが存在するためアクセスできません。
920
921 `set`によって作られたオプションはクラスレベルのメソッドです:
922
923 class MyApp < Sinatra::Base
924 # Hey, I'm in the application scope!
925 set :foo, 42
926 foo # => 42
927
928 get '/foo' do
929 # Hey, I'm no longer in the application scope!
930 end
931 end
932
933 次の場所ではアプリケーションスコープバインディングを持ちます:
934
935 * アプリケーションのクラス本体
936 * 拡張によって定義されたメソッド
937 * `helpers`に渡されたブロック
938 * `set`の値として使われるProcまたはブロック
939
940 このスコープオブジェクト(クラス)は次のように利用できます:
941
942 * configureブロックに渡されたオブジェクト経由(<tt>configure { |c| ... }</tt>)
943 * リクエストスコープの中での`settings`
944
945 === リクエスト/インスタンスのスコープ
946
947 やってくるリクエストごとに、あなたのアプリケーションクラスの新しいインスタンスが作成され、全てのハンドラブロックがそのスコープで実行されます。
948 このスコープの内側からは`request`や`session`オブジェクトにアクセスすることができ、`erb`や`haml`のような表示メソッドを呼び出すことができます。
949 リクエストスコープの内側からは、`settings`ヘルパによってアプリケーションスコープにアクセスすることができます。
950
796d62a4 » kryzhovnik
2010-11-10 README.* fixed typos
951 class MyApp < Sinatra::Base
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
952 # Hey, I'm in the application scope!
953 get '/define_route/:name' do
954 # Request scope for '/define_route/:name'
955 @value = 42
956
957 settings.get("/#{params[:name]}") do
958 # Request scope for "/#{params[:name]}"
959 @value # => nil (not the same request)
960 end
961
962 "Route defined!"
963 end
964 end
965
966 次の場所ではリクエストスコープバインディングを持ちます:
967
968 * get/head/post/put/delete ブロック
969 * before/after フィルタ
970 * helper メソッド
971 * テンプレート/ビュー
972
973 === デリゲートスコープ
974
975 デリゲートスコープは、単にクラススコープにメソッドを転送します。
976 しかしながら、クラスのバインディングを持っていないため、クラススコープと全く同じふるまいをするわけではありません:
977 委譲すると明示的に示されたメソッドのみが利用可能であり、またクラススコープと変数/状態を共有することはできません(注: 異なった`self`を持っています)。
978 <tt>Sinatra::Delegator.delegate :method_name</tt>を呼び出すことによってデリゲートするメソッドを明示的に追加することができます。
979
980 次の場所ではデリゲートスコープを持ちます:
981
982 * もし<tt>require "sinatra"</tt>しているならば、トップレベルバインディング
983 * `Sinatra::Delegator` mixinでextendされたオブジェクト
984
985 コードをご覧ください: ここでは
986 {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
987 は{main 名前空間にincludeされています}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28].
988
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
989 == コマンドライン
990
991 Sinatraアプリケーションは直接実行できます。
992
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
993 ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
994
995 オプション:
996
997 -h # ヘルプ
998 -p # ポート指定(デフォルトは4567)
4fd9aeb8 » kyanagi
2010-10-14 Updated Japanese README to follow up latest README.rdoc.
999 -o # ホスト指定(デフォルトは0.0.0.0)
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
1000 -e # 環境を指定 (デフォルトはdevelopment)
1001 -s # rackserver/handlerを指定 (デフォルトはthin)
1002 -x # mutex lockを付ける (デフォルトはoff)
1003
1004 == 最新開発版について
1005
1006 Sinatraの開発版を使いたい場合は、ローカルに開発版を落として、
1007 <tt>LOAD_PATH</tt>の<tt>sinatra/lib</tt>ディレクトリを指定して実行して下さい。
1008
1009 cd myapp
1010 git clone git://github.com/sinatra/sinatra.git
1011 ruby -Isinatra/lib myapp.rb
1012
29a57d74 » gaku
2011-06-04 Removed untranslated words and updated the Japanese translation.
1013 <tt>sinatra/lib</tt>ディレクトリをアプリケーションの<tt>LOAD_PATH</tt>に追加する方法もあります。
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
1014
1015 $LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
1016 require 'rubygems'
1017 require 'sinatra'
1018
1019 get '/about' do
1020 "今使ってるバージョンは" + Sinatra::VERSION
1021 end
1022
1023 Sinatraのソースを更新する方法:
1024
1025 cd myproject/sinatra
1026 git pull
1027
1028 == その他
1029
1030 日本語サイト
1031
1032 * {Greenbear Laboratory Rack日本語マニュアル}[http://mono.kmc.gr.jp/~yhara/w/?RackReferenceJa] - Rackの日本語マニュアル
1033
1034 英語サイト
1035
1036 * {プロジェクトサイト}[http://sinatra.github.com/] - ドキュメント、
1037 ニュース、他のリソースへのリンクがあります。
1038 * {プロジェクトに参加(貢献)する}[http://sinatra.github.com/contributing.html] - バグレポート
1039 パッチの送信、サポートなど
60ac4490 » sr
2010-07-01 lighthouse => github issue
1040 * {Issue tracker}[http://github.com/sinatra/sinatra/issues] - チケット管理とリリース計画
8ab16900 » dopin
2009-08-05 Add a Japanese translation of the README
1041 * {Twitter}[http://twitter.com/sinatra]
1042 * {メーリングリスト}[http://groups.google.com/group/sinatrarb]
1043 * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] on http://freenode.net
Something went wrong with that request. Please try again.