sinatra 1.4.0.d → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- data/CHANGES +36 -5
- data/Gemfile +5 -5
- data/README.de.md +982 -706
- data/README.fr.md +2 -2
- data/README.ko.md +12 -6
- data/README.md +52 -55
- data/README.ru.md +21 -21
- data/README.zh.md +128 -125
- data/lib/sinatra/base.rb +25 -11
- data/lib/sinatra/version.rb +1 -1
- data/test/base_test.rb +1 -1
- data/test/contest.rb +3 -1
- data/test/erb_test.rb +1 -1
- data/test/filter_test.rb +51 -1
- data/test/haml_test.rb +1 -1
- data/test/helpers_test.rb +10 -4
- data/test/integration_helper.rb +9 -4
- data/test/integration_test.rb +9 -2
- data/test/request_test.rb +13 -1
- data/test/response_test.rb +1 -2
- data/test/routing_test.rb +123 -0
- data/test/slim_test.rb +1 -1
- data/test/streaming_test.rb +7 -7
- data/test/templates_test.rb +6 -9
- data/test/wlang_test.rb +1 -1
- metadata +9 -6
data/README.zh.md
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
Sinatra是一个基于Ruby语言,以最小精力为代价快速创建web应用为目的的[DSL](http://en.wikipedia.org/wiki/Domain-specific_language)(
|
7
7
|
领域专属语言):
|
8
8
|
|
9
|
-
~~~~
|
9
|
+
~~~~ ruby
|
10
10
|
# myapp.rb
|
11
11
|
require 'sinatra'
|
12
12
|
|
@@ -17,7 +17,7 @@ end
|
|
17
17
|
|
18
18
|
安装gem然后运行:
|
19
19
|
|
20
|
-
~~~~
|
20
|
+
~~~~ shell
|
21
21
|
gem install sinatra
|
22
22
|
ruby myapp.rb
|
23
23
|
~~~~
|
@@ -31,7 +31,7 @@ ruby myapp.rb
|
|
31
31
|
在Sinatra中,一个路由是一个HTTP方法与URL匹配范式的配对。
|
32
32
|
每个路由都与一个代码块关联:
|
33
33
|
|
34
|
-
~~~~
|
34
|
+
~~~~ ruby
|
35
35
|
get '/' do
|
36
36
|
.. 显示一些事物 ..
|
37
37
|
end
|
@@ -57,7 +57,7 @@ end
|
|
57
57
|
|
58
58
|
路由范式可以包括具名参数,可通过`params`哈希表获得:
|
59
59
|
|
60
|
-
~~~~
|
60
|
+
~~~~ ruby
|
61
61
|
get '/hello/:name' do
|
62
62
|
# 匹配 "GET /hello/foo" 和 "GET /hello/bar"
|
63
63
|
# params[:name] 的值是 'foo' 或者 'bar'
|
@@ -67,7 +67,7 @@ end
|
|
67
67
|
|
68
68
|
你同样可以通过代码块参数获得具名参数:
|
69
69
|
|
70
|
-
~~~~
|
70
|
+
~~~~ ruby
|
71
71
|
get '/hello/:name' do |n|
|
72
72
|
"Hello #{n}!"
|
73
73
|
end
|
@@ -75,7 +75,7 @@ end
|
|
75
75
|
|
76
76
|
路由范式也可以包含通配符参数, 可以通过`params[:splat]`数组获得。
|
77
77
|
|
78
|
-
~~~~
|
78
|
+
~~~~ ruby
|
79
79
|
get '/say/*/to/*' do
|
80
80
|
# 匹配 /say/hello/to/world
|
81
81
|
params[:splat] # => ["hello", "world"]
|
@@ -89,7 +89,7 @@ end
|
|
89
89
|
|
90
90
|
通过正则表达式匹配的路由:
|
91
91
|
|
92
|
-
~~~~
|
92
|
+
~~~~ ruby
|
93
93
|
get %r{/hello/([\w]+)} do
|
94
94
|
"Hello, #{params[:captures].first}!"
|
95
95
|
end
|
@@ -97,7 +97,7 @@ end
|
|
97
97
|
|
98
98
|
或者使用代码块参数:
|
99
99
|
|
100
|
-
~~~~
|
100
|
+
~~~~ ruby
|
101
101
|
get %r{/hello/([\w]+)} do |c|
|
102
102
|
"Hello, #{c}!"
|
103
103
|
end
|
@@ -107,7 +107,7 @@ end
|
|
107
107
|
|
108
108
|
路由也可以包含多样的匹配条件,比如user agent:
|
109
109
|
|
110
|
-
~~~~
|
110
|
+
~~~~ ruby
|
111
111
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
112
112
|
"你正在使用Songbird,版本是 #{params[:agent][0]}"
|
113
113
|
end
|
@@ -119,7 +119,7 @@ end
|
|
119
119
|
|
120
120
|
其他可选的条件是 `host_name` 和 `provides`:
|
121
121
|
|
122
|
-
~~~~
|
122
|
+
~~~~ ruby
|
123
123
|
get '/', :host_name => /^admin\./ do
|
124
124
|
"管理员区域,无权进入!"
|
125
125
|
end
|
@@ -135,7 +135,7 @@ end
|
|
135
135
|
|
136
136
|
你也可以很轻松地定义自己的条件:
|
137
137
|
|
138
|
-
~~~~
|
138
|
+
~~~~ ruby
|
139
139
|
set(:probability) { |value| condition { rand <= value } }
|
140
140
|
|
141
141
|
get '/win_a_car', :probability => 0.1 do
|
@@ -168,7 +168,7 @@ body对象或者HTTP状态码:
|
|
168
168
|
|
169
169
|
那样,我们可以轻松的实现例如流式传输的例子:
|
170
170
|
|
171
|
-
~~~~
|
171
|
+
~~~~ ruby
|
172
172
|
class Stream
|
173
173
|
def each
|
174
174
|
100.times { |i| yield "#{i}\n" }
|
@@ -183,7 +183,7 @@ get('/') { Stream.new }
|
|
183
183
|
如上显示,Sinatra内置了对于使用字符串和正则表达式作为路由匹配的支持。
|
184
184
|
但是,它并没有只限于此。 你可以非常容易地定义你自己的匹配器:
|
185
185
|
|
186
|
-
~~~~
|
186
|
+
~~~~ ruby
|
187
187
|
class AllButPattern
|
188
188
|
Match = Struct.new(:captures)
|
189
189
|
|
@@ -208,7 +208,7 @@ end
|
|
208
208
|
|
209
209
|
请注意上面的例子可能超工程了, 因为它也可以用更简单的方式表述:
|
210
210
|
|
211
|
-
~~~~
|
211
|
+
~~~~ ruby
|
212
212
|
get // do
|
213
213
|
pass if request.path_info == "/index"
|
214
214
|
# ...
|
@@ -217,7 +217,7 @@ end
|
|
217
217
|
|
218
218
|
或者,使用消极向前查找:
|
219
219
|
|
220
|
-
~~~~
|
220
|
+
~~~~ ruby
|
221
221
|
get %r{^(?!/index$)} do
|
222
222
|
# ...
|
223
223
|
end
|
@@ -228,7 +228,7 @@ end
|
|
228
228
|
静态文件是从 `./public_folder` 目录提供服务。你可以通过设置`:public`
|
229
229
|
选项设定一个不同的位置:
|
230
230
|
|
231
|
-
~~~~
|
231
|
+
~~~~ ruby
|
232
232
|
set :public_folder, File.dirname(__FILE__) + '/static'
|
233
233
|
~~~~
|
234
234
|
|
@@ -240,7 +240,7 @@ set :public_folder, File.dirname(__FILE__) + '/static'
|
|
240
240
|
|
241
241
|
模板被假定直接位于`./views`目录。 要使用不同的视图目录:
|
242
242
|
|
243
|
-
~~~~
|
243
|
+
~~~~ ruby
|
244
244
|
set :views, File.dirname(__FILE__) + '/templates'
|
245
245
|
~~~~
|
246
246
|
|
@@ -252,7 +252,7 @@ set :views, File.dirname(__FILE__) + '/templates'
|
|
252
252
|
|
253
253
|
需要引入 `haml` gem/library以渲染 HAML 模板:
|
254
254
|
|
255
|
-
~~~~
|
255
|
+
~~~~ ruby
|
256
256
|
# 你需要在你的应用中引入 haml
|
257
257
|
require 'haml'
|
258
258
|
|
@@ -268,7 +268,7 @@ end
|
|
268
268
|
[选项和配置](http://www.sinatrarb.com/configuration.html),
|
269
269
|
也可以个别的被覆盖。
|
270
270
|
|
271
|
-
~~~~
|
271
|
+
~~~~ ruby
|
272
272
|
set :haml, {:format => :html5 } # 默认的Haml输出格式是 :xhtml
|
273
273
|
|
274
274
|
get '/' do
|
@@ -278,7 +278,7 @@ end
|
|
278
278
|
|
279
279
|
### Erb模板
|
280
280
|
|
281
|
-
~~~~
|
281
|
+
~~~~ ruby
|
282
282
|
# 你需要在你的应用中引入 erb
|
283
283
|
require 'erb'
|
284
284
|
|
@@ -293,7 +293,7 @@ end
|
|
293
293
|
|
294
294
|
需要引入 `erubis` gem/library以渲染 erubis 模板:
|
295
295
|
|
296
|
-
~~~~
|
296
|
+
~~~~ ruby
|
297
297
|
# 你需要在你的应用中引入 erubis
|
298
298
|
require 'erubis'
|
299
299
|
|
@@ -306,7 +306,7 @@ end
|
|
306
306
|
|
307
307
|
使用Erubis代替Erb也是可能的:
|
308
308
|
|
309
|
-
~~~~
|
309
|
+
~~~~ ruby
|
310
310
|
require 'erubis'
|
311
311
|
Tilt.register :erb, Tilt[:erubis]
|
312
312
|
|
@@ -321,7 +321,7 @@ end
|
|
321
321
|
|
322
322
|
需要引入 `builder` gem/library 以渲染 builder templates:
|
323
323
|
|
324
|
-
~~~~
|
324
|
+
~~~~ ruby
|
325
325
|
# 需要在你的应用中引入builder
|
326
326
|
require 'builder'
|
327
327
|
|
@@ -336,7 +336,7 @@ end
|
|
336
336
|
|
337
337
|
需要引入 `nokogiri` gem/library 以渲染 nokogiri 模板:
|
338
338
|
|
339
|
-
~~~~
|
339
|
+
~~~~ ruby
|
340
340
|
# 需要在你的应用中引入 nokogiri
|
341
341
|
require 'nokogiri'
|
342
342
|
|
@@ -351,7 +351,7 @@ end
|
|
351
351
|
|
352
352
|
需要引入 `haml` 或者 `sass` gem/library 以渲染 Sass 模板:
|
353
353
|
|
354
|
-
~~~~
|
354
|
+
~~~~ ruby
|
355
355
|
# 需要在你的应用中引入 haml 或者 sass
|
356
356
|
require 'sass'
|
357
357
|
|
@@ -368,7 +368,7 @@ end
|
|
368
368
|
[选项和配置(英文)](http://www.sinatrarb.com/configuration.html),
|
369
369
|
也可以在个体的基础上覆盖。
|
370
370
|
|
371
|
-
~~~~
|
371
|
+
~~~~ ruby
|
372
372
|
set :sass, {:style => :compact } # 默认的 Sass 样式是 :nested
|
373
373
|
|
374
374
|
get '/stylesheet.css' do
|
@@ -380,7 +380,7 @@ end
|
|
380
380
|
|
381
381
|
需要引入 `haml` 或者 `sass` gem/library 来渲染 Scss templates:
|
382
382
|
|
383
|
-
~~~~
|
383
|
+
~~~~ ruby
|
384
384
|
# 需要在你的应用中引入 haml 或者 sass
|
385
385
|
require 'sass'
|
386
386
|
|
@@ -396,7 +396,7 @@ end
|
|
396
396
|
[选项和配置(英文)](http://www.sinatrarb.com/configuration.html),
|
397
397
|
也可以在个体的基础上覆盖。
|
398
398
|
|
399
|
-
~~~~
|
399
|
+
~~~~ ruby
|
400
400
|
set :scss, :style => :compact # default Scss style is :nested
|
401
401
|
|
402
402
|
get '/stylesheet.css' do
|
@@ -408,7 +408,7 @@ end
|
|
408
408
|
|
409
409
|
需要引入 `less` gem/library 以渲染 Less 模板:
|
410
410
|
|
411
|
-
~~~~
|
411
|
+
~~~~ ruby
|
412
412
|
# 需要在你的应用中引入 less
|
413
413
|
require 'less'
|
414
414
|
|
@@ -423,7 +423,7 @@ end
|
|
423
423
|
|
424
424
|
需要引入 `liquid` gem/library 来渲染 Liquid 模板:
|
425
425
|
|
426
|
-
~~~~
|
426
|
+
~~~~ ruby
|
427
427
|
# 需要在你的应用中引入 liquid
|
428
428
|
require 'liquid'
|
429
429
|
|
@@ -437,7 +437,7 @@ end
|
|
437
437
|
因为你不能在Liquid 模板中调用 Ruby 方法 (除了 `yield`) ,
|
438
438
|
你几乎总是需要传递locals给它:
|
439
439
|
|
440
|
-
~~~~
|
440
|
+
~~~~ ruby
|
441
441
|
liquid :index, :locals => { :key => 'value' }
|
442
442
|
~~~~
|
443
443
|
|
@@ -445,7 +445,7 @@ liquid :index, :locals => { :key => 'value' }
|
|
445
445
|
|
446
446
|
需要引入 `rdiscount` gem/library 以渲染 Markdown 模板:
|
447
447
|
|
448
|
-
~~~~
|
448
|
+
~~~~ ruby
|
449
449
|
# 需要在你的应用中引入rdiscount
|
450
450
|
require "rdiscount"
|
451
451
|
|
@@ -459,13 +459,13 @@ end
|
|
459
459
|
在markdown中是不可以调用方法的,也不可以传递 locals给它。
|
460
460
|
你因此一般会结合其他的渲染引擎来使用它:
|
461
461
|
|
462
|
-
~~~~
|
462
|
+
~~~~ ruby
|
463
463
|
erb :overview, :locals => { :text => markdown(:introduction) }
|
464
464
|
~~~~
|
465
465
|
|
466
466
|
请注意你也可以从其他模板中调用 markdown 方法:
|
467
467
|
|
468
|
-
~~~~
|
468
|
+
~~~~ ruby
|
469
469
|
%h1 Hello From Haml!
|
470
470
|
%p= markdown(:greetings)
|
471
471
|
~~~~
|
@@ -474,7 +474,7 @@ erb :overview, :locals => { :text => markdown(:introduction) }
|
|
474
474
|
不过,使用其他渲染引擎作为模版的布局是可能的,
|
475
475
|
通过传递`:layout_engine`选项:
|
476
476
|
|
477
|
-
~~~~
|
477
|
+
~~~~ ruby
|
478
478
|
get '/' do
|
479
479
|
markdown :index, :layout_engine => :erb
|
480
480
|
end
|
@@ -484,7 +484,7 @@ end
|
|
484
484
|
|
485
485
|
请记住你可以全局设定这个选项:
|
486
486
|
|
487
|
-
~~~~
|
487
|
+
~~~~ ruby
|
488
488
|
set :markdown, :layout_engine => :haml, :layout => :post
|
489
489
|
|
490
490
|
get '/' do
|
@@ -497,7 +497,7 @@ end
|
|
497
497
|
|
498
498
|
也可能使用BlueCloth而不是RDiscount来解析Markdown文件:
|
499
499
|
|
500
|
-
~~~~
|
500
|
+
~~~~ ruby
|
501
501
|
require 'bluecloth'
|
502
502
|
|
503
503
|
Tilt.register 'markdown', BlueClothTemplate
|
@@ -515,7 +515,7 @@ end
|
|
515
515
|
|
516
516
|
需要引入 `RedCloth` gem/library 以渲染 Textile 模板:
|
517
517
|
|
518
|
-
~~~~
|
518
|
+
~~~~ ruby
|
519
519
|
# 在你的应用中引入redcloth
|
520
520
|
require "redcloth"
|
521
521
|
|
@@ -529,13 +529,13 @@ end
|
|
529
529
|
在textile中是不可以调用方法的,也不可以传递 locals给它。
|
530
530
|
你因此一般会结合其他的渲染引擎来使用它:
|
531
531
|
|
532
|
-
~~~~
|
532
|
+
~~~~ ruby
|
533
533
|
erb :overview, :locals => { :text => textile(:introduction) }
|
534
534
|
~~~~
|
535
535
|
|
536
536
|
请注意你也可以从其他模板中调用`textile`方法:
|
537
537
|
|
538
|
-
~~~~
|
538
|
+
~~~~ ruby
|
539
539
|
%h1 Hello From Haml!
|
540
540
|
%p= textile(:greetings)
|
541
541
|
~~~~
|
@@ -544,7 +544,7 @@ erb :overview, :locals => { :text => textile(:introduction) }
|
|
544
544
|
不过,使用其他渲染引擎作为模版的布局是可能的,
|
545
545
|
通过传递`:layout_engine`选项:
|
546
546
|
|
547
|
-
~~~~
|
547
|
+
~~~~ ruby
|
548
548
|
get '/' do
|
549
549
|
textile :index, :layout_engine => :erb
|
550
550
|
end
|
@@ -555,7 +555,7 @@ end
|
|
555
555
|
|
556
556
|
请记住你可以全局设定这个选项:
|
557
557
|
|
558
|
-
~~~~
|
558
|
+
~~~~ ruby
|
559
559
|
set :textile, :layout_engine => :haml, :layout => :post
|
560
560
|
|
561
561
|
get '/' do
|
@@ -570,7 +570,7 @@ end
|
|
570
570
|
|
571
571
|
需要引入 `RDoc` gem/library 以渲染RDoc模板:
|
572
572
|
|
573
|
-
~~~~
|
573
|
+
~~~~ ruby
|
574
574
|
# 需要在你的应用中引入rdoc/markup/to_html
|
575
575
|
require "rdoc"
|
576
576
|
require "rdoc/markup/to_html"
|
@@ -585,13 +585,13 @@ end
|
|
585
585
|
在rdoc中是不可以调用方法的,也不可以传递locals给它。
|
586
586
|
你因此一般会结合其他的渲染引擎来使用它:
|
587
587
|
|
588
|
-
~~~~
|
588
|
+
~~~~ ruby
|
589
589
|
erb :overview, :locals => { :text => rdoc(:introduction) }
|
590
590
|
~~~~
|
591
591
|
|
592
592
|
请注意你也可以从其他模板中调用`rdoc`方法:
|
593
593
|
|
594
|
-
~~~~
|
594
|
+
~~~~ ruby
|
595
595
|
%h1 Hello From Haml!
|
596
596
|
%p= rdoc(:greetings)
|
597
597
|
~~~~
|
@@ -600,7 +600,7 @@ erb :overview, :locals => { :text => rdoc(:introduction) }
|
|
600
600
|
不过,使用其他渲染引擎作为模版的布局是可能的,
|
601
601
|
通过传递`:layout_engine`选项:
|
602
602
|
|
603
|
-
~~~~
|
603
|
+
~~~~ ruby
|
604
604
|
get '/' do
|
605
605
|
rdoc :index, :layout_engine => :erb
|
606
606
|
end
|
@@ -610,7 +610,7 @@ end
|
|
610
610
|
|
611
611
|
请记住你可以全局设定这个选项:
|
612
612
|
|
613
|
-
~~~~
|
613
|
+
~~~~ ruby
|
614
614
|
set :rdoc, :layout_engine => :haml, :layout => :post
|
615
615
|
|
616
616
|
get '/' do
|
@@ -625,7 +625,7 @@ end
|
|
625
625
|
|
626
626
|
需要引入 `radius` gem/library 以渲染 Radius 模板:
|
627
627
|
|
628
|
-
~~~~
|
628
|
+
~~~~ ruby
|
629
629
|
# 需要在你的应用中引入radius
|
630
630
|
require 'radius'
|
631
631
|
|
@@ -639,7 +639,7 @@ end
|
|
639
639
|
因为你不能在Radius 模板中调用 Ruby 方法 (除了 `yield`) ,
|
640
640
|
你几乎总是需要传递locals给它:
|
641
641
|
|
642
|
-
~~~~
|
642
|
+
~~~~ ruby
|
643
643
|
radius :index, :locals => { :key => 'value' }
|
644
644
|
~~~~
|
645
645
|
|
@@ -647,7 +647,7 @@ radius :index, :locals => { :key => 'value' }
|
|
647
647
|
|
648
648
|
需要引入`markaby` gem/library以渲染Markaby模板:
|
649
649
|
|
650
|
-
~~~~
|
650
|
+
~~~~ ruby
|
651
651
|
#需要在你的应用中引入 markaby
|
652
652
|
require 'markaby'
|
653
653
|
|
@@ -660,7 +660,7 @@ end
|
|
660
660
|
|
661
661
|
你也可以使用嵌入的 Markaby:
|
662
662
|
|
663
|
-
~~~~
|
663
|
+
~~~~ ruby
|
664
664
|
get '/' do
|
665
665
|
markaby { h1 "Welcome!" }
|
666
666
|
end
|
@@ -670,7 +670,7 @@ end
|
|
670
670
|
|
671
671
|
需要引入 `slim` gem/library 来渲染 Slim 模板:
|
672
672
|
|
673
|
-
~~~~
|
673
|
+
~~~~ ruby
|
674
674
|
# 需要在你的应用中引入 slim
|
675
675
|
require 'slim'
|
676
676
|
|
@@ -685,7 +685,7 @@ end
|
|
685
685
|
|
686
686
|
需要引入 `creole` gem/library 来渲染 Creole 模板:
|
687
687
|
|
688
|
-
~~~~
|
688
|
+
~~~~ ruby
|
689
689
|
# 需要在你的应用中引入 creole
|
690
690
|
require 'creole'
|
691
691
|
|
@@ -713,7 +713,7 @@ end
|
|
713
713
|
|
714
714
|
现在你可以渲染 CoffeeScript 模版了:
|
715
715
|
|
716
|
-
~~~~
|
716
|
+
~~~~ ruby
|
717
717
|
# 需要在你的应用中引入coffee-script
|
718
718
|
require 'coffee-script'
|
719
719
|
|
@@ -726,7 +726,7 @@ end
|
|
726
726
|
|
727
727
|
### 嵌入模板字符串
|
728
728
|
|
729
|
-
~~~~
|
729
|
+
~~~~ ruby
|
730
730
|
get '/' do
|
731
731
|
haml '%div.title Hello World'
|
732
732
|
end
|
@@ -739,7 +739,7 @@ end
|
|
739
739
|
模板和路由执行器在同样的上下文求值。
|
740
740
|
在路由执行器中赋值的实例变量可以直接被模板访问。
|
741
741
|
|
742
|
-
~~~~
|
742
|
+
~~~~ ruby
|
743
743
|
get '/:id' do
|
744
744
|
@foo = Foo.find(params[:id])
|
745
745
|
haml '%h1= @foo.name'
|
@@ -748,7 +748,7 @@ end
|
|
748
748
|
|
749
749
|
或者,显式地指定一个本地变量的哈希:
|
750
750
|
|
751
|
-
~~~~
|
751
|
+
~~~~ ruby
|
752
752
|
get '/:id' do
|
753
753
|
foo = Foo.find(params[:id])
|
754
754
|
haml '%h1= foo.name', :locals => { :foo => foo }
|
@@ -761,7 +761,7 @@ end
|
|
761
761
|
|
762
762
|
模板可以在源文件的末尾定义:
|
763
763
|
|
764
|
-
~~~~
|
764
|
+
~~~~ ruby
|
765
765
|
require 'sinatra'
|
766
766
|
|
767
767
|
get '/' do
|
@@ -786,7 +786,7 @@ __END__
|
|
786
786
|
|
787
787
|
模板可以通过使用顶层 `template` 方法定义:
|
788
788
|
|
789
|
-
~~~~
|
789
|
+
~~~~ ruby
|
790
790
|
template :layout do
|
791
791
|
"%html\n =yield\n"
|
792
792
|
end
|
@@ -804,7 +804,7 @@ end
|
|
804
804
|
你可以单独地通过传送 `:layout => false`来禁用,
|
805
805
|
或者通过`set :haml, :layout => false`来禁用他们。
|
806
806
|
|
807
|
-
~~~~
|
807
|
+
~~~~ ruby
|
808
808
|
get '/' do
|
809
809
|
haml :index, :layout => !request.xhr?
|
810
810
|
end
|
@@ -816,7 +816,7 @@ end
|
|
816
816
|
`Tilt.register`。比如,如果你喜欢使用 `tt`
|
817
817
|
作为Textile模版的扩展名,你可以这样做:
|
818
818
|
|
819
|
-
~~~~
|
819
|
+
~~~~ ruby
|
820
820
|
Tilt.register :tt, Tilt[:textile]
|
821
821
|
~~~~
|
822
822
|
|
@@ -824,7 +824,7 @@ Tilt.register :tt, Tilt[:textile]
|
|
824
824
|
|
825
825
|
首先,通过Tilt注册你自己的引擎,然后创建一个渲染方法:
|
826
826
|
|
827
|
-
~~~~
|
827
|
+
~~~~ ruby
|
828
828
|
Tilt.register :myat, MyAwesomeTemplateEngine
|
829
829
|
|
830
830
|
helpers do
|
@@ -845,7 +845,7 @@ end
|
|
845
845
|
前置过滤器在每个请求前,在请求的上下文环境中被执行,
|
846
846
|
而且可以修改请求和响应。 在过滤器中设定的实例变量可以被路由和模板访问:
|
847
847
|
|
848
|
-
~~~~
|
848
|
+
~~~~ ruby
|
849
849
|
before do
|
850
850
|
@note = 'Hi!'
|
851
851
|
request.path_info = '/foo/bar/baz'
|
@@ -861,7 +861,7 @@ end
|
|
861
861
|
而且可以修改请求和响应。
|
862
862
|
在前置过滤器和路由中设定的实例变量可以被后置过滤器访问:
|
863
863
|
|
864
|
-
~~~~
|
864
|
+
~~~~ ruby
|
865
865
|
after do
|
866
866
|
puts response.status
|
867
867
|
end
|
@@ -872,7 +872,7 @@ end
|
|
872
872
|
|
873
873
|
过滤器可以可选地带有范式, 只有请求路径满足该范式时才会执行:
|
874
874
|
|
875
|
-
~~~~
|
875
|
+
~~~~ ruby
|
876
876
|
before '/protected/*' do
|
877
877
|
authenticate!
|
878
878
|
end
|
@@ -884,7 +884,7 @@ end
|
|
884
884
|
|
885
885
|
和路由一样,过滤器也可以带有条件:
|
886
886
|
|
887
|
-
~~~~
|
887
|
+
~~~~ ruby
|
888
888
|
before :agent => /Songbird/ do
|
889
889
|
# ...
|
890
890
|
end
|
@@ -898,7 +898,7 @@ end
|
|
898
898
|
|
899
899
|
使用顶层的 `helpers` 方法来定义辅助方法, 以便在路由处理器和模板中使用:
|
900
900
|
|
901
|
-
~~~~
|
901
|
+
~~~~ ruby
|
902
902
|
helpers do
|
903
903
|
def bar(name)
|
904
904
|
"#{name}bar"
|
@@ -915,7 +915,7 @@ end
|
|
915
915
|
Session被用来在请求之间保持状态。如果被激活,每一个用户会话
|
916
916
|
对应有一个session哈希:
|
917
917
|
|
918
|
-
~~~~
|
918
|
+
~~~~ ruby
|
919
919
|
enable :sessions
|
920
920
|
|
921
921
|
get '/' do
|
@@ -932,7 +932,7 @@ end
|
|
932
932
|
你可以使用任何的Rack session中间件,为了这么做, \*不要\*调用
|
933
933
|
`enable :sessions`,而是 按照自己的需要引入你的中间件:
|
934
934
|
|
935
|
-
~~~~
|
935
|
+
~~~~ ruby
|
936
936
|
use Rack::Session::Pool, :expire_after => 2592000
|
937
937
|
|
938
938
|
get '/' do
|
@@ -948,31 +948,31 @@ end
|
|
948
948
|
|
949
949
|
要想直接地停止请求,在过滤器或者路由中使用:
|
950
950
|
|
951
|
-
~~~~
|
951
|
+
~~~~ ruby
|
952
952
|
halt
|
953
953
|
~~~~
|
954
954
|
|
955
955
|
你也可以指定挂起时的状态码:
|
956
956
|
|
957
|
-
~~~~
|
957
|
+
~~~~ ruby
|
958
958
|
halt 410
|
959
959
|
~~~~
|
960
960
|
|
961
961
|
或者消息体:
|
962
962
|
|
963
|
-
~~~~
|
963
|
+
~~~~ ruby
|
964
964
|
halt 'this will be the body'
|
965
965
|
~~~~
|
966
966
|
|
967
967
|
或者两者;
|
968
968
|
|
969
|
-
~~~~
|
969
|
+
~~~~ ruby
|
970
970
|
halt 401, 'go away!'
|
971
971
|
~~~~
|
972
972
|
|
973
973
|
也可以带消息头:
|
974
974
|
|
975
|
-
~~~~
|
975
|
+
~~~~ ruby
|
976
976
|
halt 402, {'Content-Type' => 'text/plain'}, 'revenge'
|
977
977
|
~~~~
|
978
978
|
|
@@ -980,7 +980,7 @@ halt 402, {'Content-Type' => 'text/plain'}, 'revenge'
|
|
980
980
|
|
981
981
|
一个路由可以放弃处理,将处理让给下一个匹配的路由,使用 `pass`:
|
982
982
|
|
983
|
-
~~~~
|
983
|
+
~~~~ ruby
|
984
984
|
get '/guess/:who' do
|
985
985
|
pass unless params[:who] == 'Frank'
|
986
986
|
'You got me!'
|
@@ -999,7 +999,7 @@ end
|
|
999
999
|
有些时候,`pass` 并不是你想要的,你希望得到的是另一个路由的结果
|
1000
1000
|
。简单的使用 `call` 可以做到这一点:
|
1001
1001
|
|
1002
|
-
~~~~
|
1002
|
+
~~~~ ruby
|
1003
1003
|
get '/foo' do
|
1004
1004
|
status, headers, body = call env.merge("PATH_INFO" => '/bar')
|
1005
1005
|
[status, headers, body.map(&:upcase)]
|
@@ -1028,7 +1028,7 @@ end
|
|
1028
1028
|
`body` 辅助方法这么做。 如果你这样做了,
|
1029
1029
|
你可以在那以后使用该方法获得消息体:
|
1030
1030
|
|
1031
|
-
~~~~
|
1031
|
+
~~~~ ruby
|
1032
1032
|
get '/foo' do
|
1033
1033
|
body "bar"
|
1034
1034
|
end
|
@@ -1043,7 +1043,7 @@ end
|
|
1043
1043
|
|
1044
1044
|
和消息体类似,你也可以设定状态码和消息头:
|
1045
1045
|
|
1046
|
-
~~~~
|
1046
|
+
~~~~ ruby
|
1047
1047
|
get '/foo' do
|
1048
1048
|
status 418
|
1049
1049
|
headers \
|
@@ -1061,13 +1061,13 @@ end
|
|
1061
1061
|
当使用 `send_file` 或者静态文件的场合,你的媒体类型可能
|
1062
1062
|
Sinatra并不理解。使用 `mime_type` 通过文件扩展名来注册它们:
|
1063
1063
|
|
1064
|
-
~~~~
|
1064
|
+
~~~~ ruby
|
1065
1065
|
mime_type :foo, 'text/foo'
|
1066
1066
|
~~~~
|
1067
1067
|
|
1068
1068
|
你也可以通过 `content_type` 辅助方法使用:
|
1069
1069
|
|
1070
|
-
~~~~
|
1070
|
+
~~~~ ruby
|
1071
1071
|
get '/' do
|
1072
1072
|
content_type :foo
|
1073
1073
|
"foo foo foo"
|
@@ -1078,7 +1078,7 @@ end
|
|
1078
1078
|
|
1079
1079
|
为了生成URL,你需要使用 `url` 辅助方法, 例如,在Haml中:
|
1080
1080
|
|
1081
|
-
~~~~
|
1081
|
+
~~~~ ruby
|
1082
1082
|
%a{:href => url('/foo')} foo
|
1083
1083
|
~~~~
|
1084
1084
|
|
@@ -1090,7 +1090,7 @@ end
|
|
1090
1090
|
|
1091
1091
|
你可以通过 `redirect` 辅助方法触发浏览器重定向:
|
1092
1092
|
|
1093
|
-
~~~~
|
1093
|
+
~~~~ ruby
|
1094
1094
|
get '/foo' do
|
1095
1095
|
redirect to('/bar')
|
1096
1096
|
end
|
@@ -1098,14 +1098,14 @@ end
|
|
1098
1098
|
|
1099
1099
|
任何额外的参数都会被以 `halt`相同的方式来处理:
|
1100
1100
|
|
1101
|
-
~~~~
|
1101
|
+
~~~~ ruby
|
1102
1102
|
redirect to('/bar'), 303
|
1103
1103
|
redirect 'http://google.com', 'wrong place, buddy'
|
1104
1104
|
~~~~
|
1105
1105
|
|
1106
1106
|
你可以方便的通过 `redirect back`把用户重定向到来自的页面:
|
1107
1107
|
|
1108
|
-
~~~~
|
1108
|
+
~~~~ ruby
|
1109
1109
|
get '/foo' do
|
1110
1110
|
"<a href='/bar'>do something</a>"
|
1111
1111
|
end
|
@@ -1118,13 +1118,13 @@ end
|
|
1118
1118
|
|
1119
1119
|
为了传递参数给redirect,或者加入query:
|
1120
1120
|
|
1121
|
-
~~~~
|
1121
|
+
~~~~ ruby
|
1122
1122
|
redirect to('/bar?sum=42')
|
1123
1123
|
~~~~
|
1124
1124
|
|
1125
1125
|
或者使用session:
|
1126
1126
|
|
1127
|
-
~~~~
|
1127
|
+
~~~~ ruby
|
1128
1128
|
enable :sessions
|
1129
1129
|
|
1130
1130
|
get '/foo' do
|
@@ -1143,7 +1143,7 @@ end
|
|
1143
1143
|
|
1144
1144
|
你可以方便的设定 Cache-Control 消息头,像这样:
|
1145
1145
|
|
1146
|
-
~~~~
|
1146
|
+
~~~~ ruby
|
1147
1147
|
get '/' do
|
1148
1148
|
cache_control :public
|
1149
1149
|
"cache it!"
|
@@ -1152,7 +1152,7 @@ end
|
|
1152
1152
|
|
1153
1153
|
核心提示: 在前置过滤器中设定缓存.
|
1154
1154
|
|
1155
|
-
~~~~
|
1155
|
+
~~~~ ruby
|
1156
1156
|
before do
|
1157
1157
|
cache_control :public, :must_revalidate, :max_age => 60
|
1158
1158
|
end
|
@@ -1161,7 +1161,7 @@ end
|
|
1161
1161
|
如果你正在用 `expires` 辅助方法设定对应的消息头 `Cache-Control`
|
1162
1162
|
会自动设定:
|
1163
1163
|
|
1164
|
-
~~~~
|
1164
|
+
~~~~ ruby
|
1165
1165
|
before do
|
1166
1166
|
expires 500, :public, :must_revalidate
|
1167
1167
|
end
|
@@ -1171,7 +1171,7 @@ end
|
|
1171
1171
|
推荐在执行繁重任务\*之前\*使用这些helpers,
|
1172
1172
|
他们会立刻发送响应,如果客户端在缓存中已经有了当前版本。
|
1173
1173
|
|
1174
|
-
~~~~
|
1174
|
+
~~~~ ruby
|
1175
1175
|
get '/article/:id' do
|
1176
1176
|
@article = Article.find params[:id]
|
1177
1177
|
last_modified @article.updated_at
|
@@ -1184,7 +1184,7 @@ end
|
|
1184
1184
|
ETag](http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation)
|
1185
1185
|
也是有可能的:
|
1186
1186
|
|
1187
|
-
~~~~
|
1187
|
+
~~~~ ruby
|
1188
1188
|
etag @article.sha1, :weak
|
1189
1189
|
~~~~
|
1190
1190
|
|
@@ -1192,7 +1192,7 @@ etag @article.sha1, :weak
|
|
1192
1192
|
如果你在寻找缓存的快速解决方案,试试
|
1193
1193
|
[rack-cache](https://github.com/rtomayko/rack-cache):
|
1194
1194
|
|
1195
|
-
~~~~
|
1195
|
+
~~~~ ruby
|
1196
1196
|
require "rack/cache"
|
1197
1197
|
require "sinatra"
|
1198
1198
|
|
@@ -1209,7 +1209,7 @@ end
|
|
1209
1209
|
|
1210
1210
|
为了发送文件,你可以使用 `send_file` 辅助方法:
|
1211
1211
|
|
1212
|
-
~~~~
|
1212
|
+
~~~~ ruby
|
1213
1213
|
get '/' do
|
1214
1214
|
send_file 'foo.png'
|
1215
1215
|
end
|
@@ -1217,7 +1217,7 @@ end
|
|
1217
1217
|
|
1218
1218
|
也可以带一些选项:
|
1219
1219
|
|
1220
|
-
~~~~
|
1220
|
+
~~~~ ruby
|
1221
1221
|
send_file 'foo.png', :type => :jpg
|
1222
1222
|
~~~~
|
1223
1223
|
|
@@ -1251,7 +1251,7 @@ send_file 'foo.png', :type => :jpg
|
|
1251
1251
|
传入的请求对象可以在请求层(过滤器,路由,错误处理) 通过 `request`
|
1252
1252
|
方法被访问:
|
1253
1253
|
|
1254
|
-
~~~~
|
1254
|
+
~~~~ ruby
|
1255
1255
|
# 在 http://example.com/example 上运行的应用
|
1256
1256
|
get '/foo' do
|
1257
1257
|
request.body # 被客户端设定的请求体(见下)
|
@@ -1282,7 +1282,7 @@ end
|
|
1282
1282
|
|
1283
1283
|
一些选项,例如 `script_name` 或者 `path_info` 也是可写的:
|
1284
1284
|
|
1285
|
-
~~~~
|
1285
|
+
~~~~ ruby
|
1286
1286
|
before { request.path_info = "/" }
|
1287
1287
|
|
1288
1288
|
get "/" do
|
@@ -1292,7 +1292,7 @@ end
|
|
1292
1292
|
|
1293
1293
|
`request.body` 是一个IO或者StringIO对象:
|
1294
1294
|
|
1295
|
-
~~~~
|
1295
|
+
~~~~ ruby
|
1296
1296
|
post "/api" do
|
1297
1297
|
request.body.rewind # 如果已经有人读了它
|
1298
1298
|
data = JSON.parse request.body.read
|
@@ -1305,7 +1305,7 @@ end
|
|
1305
1305
|
你可以使用 `attachment` 辅助方法来告诉浏览器响应
|
1306
1306
|
应当被写入磁盘而不是在浏览器中显示。
|
1307
1307
|
|
1308
|
-
~~~~
|
1308
|
+
~~~~ ruby
|
1309
1309
|
get '/' do
|
1310
1310
|
attachment
|
1311
1311
|
"store it!"
|
@@ -1314,7 +1314,7 @@ end
|
|
1314
1314
|
|
1315
1315
|
你也可以传递一个文件名:
|
1316
1316
|
|
1317
|
-
~~~~
|
1317
|
+
~~~~ ruby
|
1318
1318
|
get '/' do
|
1319
1319
|
attachment "info.txt"
|
1320
1320
|
"store it!"
|
@@ -1325,7 +1325,7 @@ end
|
|
1325
1325
|
|
1326
1326
|
`find_template` 辅助方法被用于在渲染时查找模板文件:
|
1327
1327
|
|
1328
|
-
~~~~
|
1328
|
+
~~~~ ruby
|
1329
1329
|
find_template settings.views, 'foo', Tilt[:haml] do |file|
|
1330
1330
|
puts "could be #{file}"
|
1331
1331
|
end
|
@@ -1334,7 +1334,7 @@ end
|
|
1334
1334
|
这并不是很有用。但是在你需要重载这个方法
|
1335
1335
|
来实现你自己的查找机制的时候有用。 比如,如果你想支持多于一个视图目录:
|
1336
1336
|
|
1337
|
-
~~~~
|
1337
|
+
~~~~ ruby
|
1338
1338
|
set :views, ['views', 'templates']
|
1339
1339
|
|
1340
1340
|
helpers do
|
@@ -1346,7 +1346,7 @@ end
|
|
1346
1346
|
|
1347
1347
|
另一个例子是为不同的引擎使用不同的目录:
|
1348
1348
|
|
1349
|
-
~~~~
|
1349
|
+
~~~~ ruby
|
1350
1350
|
set :views, :sass => 'views/sass', :haml => 'templates', :default => 'views'
|
1351
1351
|
|
1352
1352
|
helpers do
|
@@ -1370,7 +1370,7 @@ end
|
|
1370
1370
|
|
1371
1371
|
运行一次,在启动的时候,在任何环境下:
|
1372
1372
|
|
1373
|
-
~~~~
|
1373
|
+
~~~~ ruby
|
1374
1374
|
configure do
|
1375
1375
|
# setting one option
|
1376
1376
|
set :option, 'value'
|
@@ -1391,7 +1391,7 @@ end
|
|
1391
1391
|
|
1392
1392
|
只当环境 (RACK\_ENV environment 变量) 被设定为 `:production`的时候运行:
|
1393
1393
|
|
1394
|
-
~~~~
|
1394
|
+
~~~~ ruby
|
1395
1395
|
configure :production do
|
1396
1396
|
...
|
1397
1397
|
end
|
@@ -1399,7 +1399,7 @@ end
|
|
1399
1399
|
|
1400
1400
|
当环境被设定为 `:production` 或者 `:test`的时候运行:
|
1401
1401
|
|
1402
|
-
~~~~
|
1402
|
+
~~~~ ruby
|
1403
1403
|
configure :production, :test do
|
1404
1404
|
...
|
1405
1405
|
end
|
@@ -1407,7 +1407,7 @@ end
|
|
1407
1407
|
|
1408
1408
|
你可以使用 `settings` 获得这些配置:
|
1409
1409
|
|
1410
|
-
~~~~
|
1410
|
+
~~~~ ruby
|
1411
1411
|
configure do
|
1412
1412
|
set :foo, 'bar'
|
1413
1413
|
end
|
@@ -1427,14 +1427,16 @@ end
|
|
1427
1427
|
<p>
|
1428
1428
|
如果被禁用,Sinatra会允许使用相对路径重定向, 但是,Sinatra就不再遵守
|
1429
1429
|
RFC 2616标准 (HTTP 1.1), 该标准只允许绝对路径重定向。
|
1430
|
+
</p>
|
1430
1431
|
|
1431
1432
|
<p>
|
1432
1433
|
如果你的应用运行在一个未恰当设置的反向代理之后,
|
1433
1434
|
你需要启用这个选项。注意 <tt>url</tt> 辅助方法 仍然会生成绝对 URL,除非你传入
|
1434
1435
|
<tt>false</tt> 作为第二参数。
|
1435
|
-
|
1436
|
+
</p>
|
1436
1437
|
<p>
|
1437
1438
|
默认禁用。
|
1439
|
+
</p>
|
1438
1440
|
</dd>
|
1439
1441
|
|
1440
1442
|
<dt>add_charsets</dt>
|
@@ -1566,6 +1568,7 @@ end
|
|
1566
1568
|
</dd>
|
1567
1569
|
</dl>
|
1568
1570
|
|
1571
|
+
|
1569
1572
|
## 错误处理
|
1570
1573
|
|
1571
1574
|
错误处理在与路由和前置过滤器相同的上下文中运行,
|
@@ -1576,7 +1579,7 @@ end
|
|
1576
1579
|
当一个 `Sinatra::NotFound` 错误被抛出的时候,
|
1577
1580
|
或者响应状态码是404,`not_found` 处理器会被调用:
|
1578
1581
|
|
1579
|
-
~~~~
|
1582
|
+
~~~~ ruby
|
1580
1583
|
not_found do
|
1581
1584
|
'This is nowhere to be found'
|
1582
1585
|
end
|
@@ -1587,7 +1590,7 @@ end
|
|
1587
1590
|
`error` 处理器,在任何路由代码块或者过滤器抛出异常的时候会被调用。
|
1588
1591
|
异常对象可以通过`sinatra.error` Rack 变量获得:
|
1589
1592
|
|
1590
|
-
~~~~
|
1593
|
+
~~~~ ruby
|
1591
1594
|
error do
|
1592
1595
|
'Sorry there was a nasty error - ' + env['sinatra.error'].name
|
1593
1596
|
end
|
@@ -1595,7 +1598,7 @@ end
|
|
1595
1598
|
|
1596
1599
|
自定义错误:
|
1597
1600
|
|
1598
|
-
~~~~
|
1601
|
+
~~~~ ruby
|
1599
1602
|
error MyCustomError do
|
1600
1603
|
'So what happened was...' + env['sinatra.error'].message
|
1601
1604
|
end
|
@@ -1603,7 +1606,7 @@ end
|
|
1603
1606
|
|
1604
1607
|
那么,当这个发生的时候:
|
1605
1608
|
|
1606
|
-
~~~~
|
1609
|
+
~~~~ ruby
|
1607
1610
|
get '/' do
|
1608
1611
|
raise MyCustomError, 'something bad'
|
1609
1612
|
end
|
@@ -1615,7 +1618,7 @@ end
|
|
1615
1618
|
|
1616
1619
|
另一种替代方法是,为一个状态码安装错误处理器:
|
1617
1620
|
|
1618
|
-
~~~~
|
1621
|
+
~~~~ ruby
|
1619
1622
|
error 403 do
|
1620
1623
|
'Access forbidden'
|
1621
1624
|
end
|
@@ -1627,7 +1630,7 @@ end
|
|
1627
1630
|
|
1628
1631
|
或者一个范围:
|
1629
1632
|
|
1630
|
-
~~~~
|
1633
|
+
~~~~ ruby
|
1631
1634
|
error 400..510 do
|
1632
1635
|
'Boom'
|
1633
1636
|
end
|
@@ -1645,7 +1648,7 @@ Rack的一个最有趣的面向应用开发者的能力是支持“中间件”
|
|
1645
1648
|
|
1646
1649
|
Sinatra 让建立Rack中间件管道异常简单, 通过顶层的 `use` 方法:
|
1647
1650
|
|
1648
|
-
~~~~
|
1651
|
+
~~~~ ruby
|
1649
1652
|
require 'sinatra'
|
1650
1653
|
require 'my_custom_middleware'
|
1651
1654
|
|
@@ -1662,7 +1665,7 @@ end
|
|
1662
1665
|
DSL(在rack文件中最频繁使用)中定义的完全一样。例如,`use` 方法接受
|
1663
1666
|
多个/可变 参数,包括代码块:
|
1664
1667
|
|
1665
|
-
~~~~
|
1668
|
+
~~~~ ruby
|
1666
1669
|
use Rack::Auth::Basic do |username, password|
|
1667
1670
|
username == 'admin' && password == 'secret'
|
1668
1671
|
end
|
@@ -1677,7 +1680,7 @@ Rack中分布有多样的标准中间件,针对日志,
|
|
1677
1680
|
Sinatra的测试可以使用任何基于Rack的测试程序库或者框架来编写。
|
1678
1681
|
[Rack::Test](http://gitrdoc.com/brynary/rack-test) 是推荐候选:
|
1679
1682
|
|
1680
|
-
~~~~
|
1683
|
+
~~~~ ruby
|
1681
1684
|
require 'my_sinatra_app'
|
1682
1685
|
require 'test/unit'
|
1683
1686
|
require 'rack/test'
|
@@ -1719,7 +1722,7 @@ metal,带有服务器组件的简单程序库,
|
|
1719
1722
|
./views 目录,日志,异常细节页面,等等)。 这时应该让 Sinatra::Base
|
1720
1723
|
走到台前了:
|
1721
1724
|
|
1722
|
-
~~~~
|
1725
|
+
~~~~ ruby
|
1723
1726
|
require 'sinatra/base'
|
1724
1727
|
|
1725
1728
|
class MyApp < Sinatra::Base
|
@@ -1775,7 +1778,7 @@ Sinatra::Base子类可用的方法实际上就是通过顶层 DSL 可用的方
|
|
1775
1778
|
|
1776
1779
|
有两种方式运行一个模块化应用,使用 `run!`来运行:
|
1777
1780
|
|
1778
|
-
~~~~
|
1781
|
+
~~~~ ruby
|
1779
1782
|
# my_app.rb
|
1780
1783
|
require 'sinatra/base'
|
1781
1784
|
|
@@ -1793,7 +1796,7 @@ end
|
|
1793
1796
|
|
1794
1797
|
或者使用一个 `config.ru`,允许你使用任何Rack处理器:
|
1795
1798
|
|
1796
|
-
~~~~
|
1799
|
+
~~~~ ruby
|
1797
1800
|
# config.ru
|
1798
1801
|
require './my_app'
|
1799
1802
|
run MyApp
|
@@ -1807,7 +1810,7 @@ run MyApp
|
|
1807
1810
|
|
1808
1811
|
编写你的应用:
|
1809
1812
|
|
1810
|
-
~~~~
|
1813
|
+
~~~~ ruby
|
1811
1814
|
# app.rb
|
1812
1815
|
require 'sinatra'
|
1813
1816
|
|
@@ -1818,7 +1821,7 @@ end
|
|
1818
1821
|
|
1819
1822
|
加入相应的 `config.ru`:
|
1820
1823
|
|
1821
|
-
~~~~
|
1824
|
+
~~~~ ruby
|
1822
1825
|
require './app'
|
1823
1826
|
run Sinatra::Application
|
1824
1827
|
~~~~
|
@@ -1843,7 +1846,7 @@ run Sinatra::Application
|
|
1843
1846
|
这个端点可以是任何Sinatra应用,或者任何基于Rack的应用程序
|
1844
1847
|
(Rails/Ramaze/Camping/…)。
|
1845
1848
|
|
1846
|
-
~~~~
|
1849
|
+
~~~~ ruby
|
1847
1850
|
require 'sinatra/base'
|
1848
1851
|
|
1849
1852
|
class LoginScreen < Sinatra::Base
|
@@ -1889,7 +1892,7 @@ Sinatra::Application,或者这个类就是你显式创建的子类。
|
|
1889
1892
|
|
1890
1893
|
通过 \`set\` 创建的选项是类层面的方法:
|
1891
1894
|
|
1892
|
-
~~~~
|
1895
|
+
~~~~ ruby
|
1893
1896
|
class MyApp < Sinatra::Base
|
1894
1897
|
# 嘿,我在应用变量域!
|
1895
1898
|
set :foo, 42
|
@@ -1925,7 +1928,7 @@ end
|
|
1925
1928
|
\`haml\`。你可以在请求变量域当中通过\`settings\`辅助方法
|
1926
1929
|
访问应用变量域:
|
1927
1930
|
|
1928
|
-
~~~~
|
1931
|
+
~~~~ ruby
|
1929
1932
|
class MyApp < Sinatra::Base
|
1930
1933
|
# 嘿,我在应用变量域!
|
1931
1934
|
get '/define_route/:name' do
|
@@ -2075,7 +2078,7 @@ Sinatra应该会运行在任何支持上述Ruby实现的操作系统。
|
|
2075
2078
|
|
2076
2079
|
然后,在你的项目目录下,创建一个 `Gemfile`:
|
2077
2080
|
|
2078
|
-
~~~~
|
2081
|
+
~~~~ ruby
|
2079
2082
|
source :rubygems
|
2080
2083
|
gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
|
2081
2084
|
|