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.

@@ -6,7 +6,7 @@
6
6
  Sinatra是一个基于Ruby语言,以最小精力为代价快速创建web应用为目的的[DSL](http://en.wikipedia.org/wiki/Domain-specific_language)(
7
7
  领域专属语言):
8
8
 
9
- ~~~~ {.ruby}
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
- ~~~~ {.shell}
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
- ~~~~ {.ruby}
34
+ ~~~~ ruby
35
35
  get '/' do
36
36
  .. 显示一些事物 ..
37
37
  end
@@ -57,7 +57,7 @@ end
57
57
 
58
58
  路由范式可以包括具名参数,可通过`params`哈希表获得:
59
59
 
60
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
462
+ ~~~~ ruby
463
463
  erb :overview, :locals => { :text => markdown(:introduction) }
464
464
  ~~~~
465
465
 
466
466
  请注意你也可以从其他模板中调用 markdown 方法:
467
467
 
468
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
532
+ ~~~~ ruby
533
533
  erb :overview, :locals => { :text => textile(:introduction) }
534
534
  ~~~~
535
535
 
536
536
  请注意你也可以从其他模板中调用`textile`方法:
537
537
 
538
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
588
+ ~~~~ ruby
589
589
  erb :overview, :locals => { :text => rdoc(:introduction) }
590
590
  ~~~~
591
591
 
592
592
  请注意你也可以从其他模板中调用`rdoc`方法:
593
593
 
594
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
650
+ ~~~~ ruby
651
651
  #需要在你的应用中引入 markaby
652
652
  require 'markaby'
653
653
 
@@ -660,7 +660,7 @@ end
660
660
 
661
661
  你也可以使用嵌入的 Markaby:
662
662
 
663
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
688
+ ~~~~ ruby
689
689
  # 需要在你的应用中引入 creole
690
690
  require 'creole'
691
691
 
@@ -713,7 +713,7 @@ end
713
713
 
714
714
  现在你可以渲染 CoffeeScript 模版了:
715
715
 
716
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
951
+ ~~~~ ruby
952
952
  halt
953
953
  ~~~~
954
954
 
955
955
  你也可以指定挂起时的状态码:
956
956
 
957
- ~~~~ {.ruby}
957
+ ~~~~ ruby
958
958
  halt 410
959
959
  ~~~~
960
960
 
961
961
  或者消息体:
962
962
 
963
- ~~~~ {.ruby}
963
+ ~~~~ ruby
964
964
  halt 'this will be the body'
965
965
  ~~~~
966
966
 
967
967
  或者两者;
968
968
 
969
- ~~~~ {.ruby}
969
+ ~~~~ ruby
970
970
  halt 401, 'go away!'
971
971
  ~~~~
972
972
 
973
973
  也可以带消息头:
974
974
 
975
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
1064
+ ~~~~ ruby
1065
1065
  mime_type :foo, 'text/foo'
1066
1066
  ~~~~
1067
1067
 
1068
1068
  你也可以通过 `content_type` 辅助方法使用:
1069
1069
 
1070
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
1121
+ ~~~~ ruby
1122
1122
  redirect to('/bar?sum=42')
1123
1123
  ~~~~
1124
1124
 
1125
1125
  或者使用session:
1126
1126
 
1127
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
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
- ~~~~ {.ruby}
2081
+ ~~~~ ruby
2079
2082
  source :rubygems
2080
2083
  gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
2081
2084