sinatra 1.4.4 → 1.4.5

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.

@@ -1,10 +1,10 @@
1
1
  # Sinatra
2
2
 
3
- *注:本文档仅仅是英文版的翻译,会出现内容没有及时更新的情况发生。
3
+ *注:本文档是英文版的翻译,内容更新有可能不及时。
4
4
  如有不一致的地方,请以英文版为准。*
5
5
 
6
- Sinatra是一个基于Ruby语言,以最小精力为代价快速创建web应用为目的的[DSL](http://en.wikipedia.org/wiki/Domain-specific_language)(
7
- 领域专属语言):
6
+ Sinatra是一个基于Ruby语言的[DSL](http://en.wikipedia.org/wiki/Domain-specific_language)(
7
+ 领域专属语言),可以轻松、快速的创建web应用。
8
8
 
9
9
  ~~~~ ruby
10
10
  # myapp.rb
@@ -15,7 +15,7 @@ get '/' do
15
15
  end
16
16
  ~~~~
17
17
 
18
- 安装gem然后运行:
18
+ 安装gem,然后运行:
19
19
 
20
20
  ~~~~ shell
21
21
  gem install sinatra
@@ -24,33 +24,43 @@ ruby myapp.rb
24
24
 
25
25
  在该地址查看: [localhost:4567](http://localhost:4567)
26
26
 
27
- 推荐同时运行`gem install thin`,Sinatra会优先选择thin作为服务器。
27
+ 安装Sintra后,最好再运行`gem install thin`安装Thin。这样,Sinatra会优先选择Thin作为服务器。
28
28
 
29
- ## 路由
29
+ ## 路由(route)
30
30
 
31
- 在Sinatra中,一个路由是一个HTTP方法与URL匹配范式的配对。
32
- 每个路由都与一个代码块关联:
31
+ 在Sinatra中,一个路由分为两部分:HTTP方法(GET, POST等)和URL匹配范式。
32
+ 每个路由都有一个要执行的代码块:
33
33
 
34
34
  ~~~~ ruby
35
35
  get '/' do
36
- .. 显示一些事物 ..
36
+ .. 显示内容 ..
37
37
  end
38
38
 
39
39
  post '/' do
40
- .. 创建一些事物 ..
40
+ .. 创建内容 ..
41
41
  end
42
42
 
43
43
  put '/' do
44
- .. 更新一些事物 ..
44
+ .. 更新内容 ..
45
45
  end
46
46
 
47
47
  delete '/' do
48
- .. 消灭一些事物 ..
48
+ .. 删除内容 ..
49
49
  end
50
50
 
51
51
  options '/' do
52
- .. 满足一些事物 ..
52
+ .. 显示命令列表 ..
53
53
  end
54
+
55
+ link '/' do
56
+ .. 建立某种联系 ..
57
+ end
58
+
59
+ unlink '/' do
60
+ .. 解除某种联系 ..
61
+ end
62
+
63
+
54
64
  ~~~~
55
65
 
56
66
  路由按照它们被定义的顺序进行匹配。 第一个与请求匹配的路由会被调用。
@@ -133,7 +143,7 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
133
143
  end
134
144
  ~~~~
135
145
 
136
- 你也可以很轻松地定义自己的条件:
146
+ 你也可以自定义条件:
137
147
 
138
148
  ~~~~ ruby
139
149
  set(:probability) { |value| condition { rand <= value } }
@@ -206,7 +216,7 @@ get all_but("/index") do
206
216
  end
207
217
  ~~~~
208
218
 
209
- 请注意上面的例子可能超工程了, 因为它也可以用更简单的方式表述:
219
+ 上面的例子可能太繁琐了, 因为它也可以用更简单的方式表述:
210
220
 
211
221
  ~~~~ ruby
212
222
  get // do
@@ -287,7 +297,7 @@ get '/' do
287
297
  end
288
298
  ~~~~
289
299
 
290
- 渲染 `./views/index.erb`
300
+ 这里调用的是 `./views/index.erb`
291
301
 
292
302
  ### Erubis
293
303
 
@@ -302,7 +312,7 @@ get '/' do
302
312
  end
303
313
  ~~~~
304
314
 
305
- 渲染 `./views/index.erubis`
315
+ 这里调用的是 `./views/index.erubis`
306
316
 
307
317
  使用Erubis代替Erb也是可能的:
308
318
 
@@ -330,7 +340,7 @@ get '/' do
330
340
  end
331
341
  ~~~~
332
342
 
333
- 渲染 `./views/index.builder`。
343
+ 这里调用的是 `./views/index.builder`。
334
344
 
335
345
  ### Nokogiri 模板
336
346
 
@@ -345,7 +355,7 @@ get '/' do
345
355
  end
346
356
  ~~~~
347
357
 
348
- 渲染 `./views/index.nokogiri`。
358
+ 这里调用的是 `./views/index.nokogiri`。
349
359
 
350
360
  ### Sass 模板
351
361
 
@@ -360,7 +370,7 @@ get '/stylesheet.css' do
360
370
  end
361
371
  ~~~~
362
372
 
363
- 渲染 `./views/stylesheet.sass`。
373
+ 这里调用的是 `./views/stylesheet.sass`。
364
374
 
365
375
  [Sass
366
376
  的选项](http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options)
@@ -389,7 +399,7 @@ get '/stylesheet.css' do
389
399
  end
390
400
  ~~~~
391
401
 
392
- 渲染 `./views/stylesheet.scss`。
402
+ 这里调用的是 `./views/stylesheet.scss`。
393
403
 
394
404
  [Scss的选项](http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options)
395
405
  可以通过Sinatra选项全局设定, 参考
@@ -417,7 +427,7 @@ get '/stylesheet.css' do
417
427
  end
418
428
  ~~~~
419
429
 
420
- 渲染 `./views/stylesheet.less`。
430
+ 这里调用的是 `./views/stylesheet.less`。
421
431
 
422
432
  ### Liquid 模板
423
433
 
@@ -432,7 +442,7 @@ get '/' do
432
442
  end
433
443
  ~~~~
434
444
 
435
- 渲染 `./views/index.liquid`。
445
+ 这里调用的是 `./views/index.liquid`。
436
446
 
437
447
  因为你不能在Liquid 模板中调用 Ruby 方法 (除了 `yield`) ,
438
448
  你几乎总是需要传递locals给它:
@@ -454,7 +464,7 @@ get '/' do
454
464
  end
455
465
  ~~~~
456
466
 
457
- 渲染 `./views/index.markdown` (`md` 和 `mkd` 也是合理的文件扩展名)。
467
+ 这里调用的是 `./views/index.markdown` (`md` 和 `mkd` 也是合理的文件扩展名)。
458
468
 
459
469
  在markdown中是不可以调用方法的,也不可以传递 locals给它。
460
470
  你因此一般会结合其他的渲染引擎来使用它:
@@ -480,7 +490,7 @@ get '/' do
480
490
  end
481
491
  ~~~~
482
492
 
483
- 这将会渲染 `./views/index.md` 并使用 `./views/layout.erb` 作为布局。
493
+ 这将会调用 `./views/index.md` 并使用 `./views/layout.erb` 作为布局。
484
494
 
485
495
  请记住你可以全局设定这个选项:
486
496
 
@@ -492,7 +502,7 @@ get '/' do
492
502
  end
493
503
  ~~~~
494
504
 
495
- 这将会渲染 `./views/index.markdown` (和任何其他的 Markdown 模版) 并使用
505
+ 这将会调用 `./views/index.markdown` (和任何其他的 Markdown 模版) 并使用
496
506
  `./views/post.haml` 作为布局.
497
507
 
498
508
  也可能使用BlueCloth而不是RDiscount来解析Markdown文件:
@@ -524,7 +534,7 @@ get '/' do
524
534
  end
525
535
  ~~~~
526
536
 
527
- 渲染 `./views/index.textile`。
537
+ 这里调用的是 `./views/index.textile`。
528
538
 
529
539
  在textile中是不可以调用方法的,也不可以传递 locals给它。
530
540
  你因此一般会结合其他的渲染引擎来使用它:
@@ -563,7 +573,7 @@ get '/' do
563
573
  end
564
574
  ~~~~
565
575
 
566
- 这将会渲染 `./views/index.textile` (和任何其他的 Textile 模版) 并使用
576
+ 这将会调用 `./views/index.textile` (和任何其他的 Textile 模版) 并使用
567
577
  `./views/post.haml` 作为布局.
568
578
 
569
579
  ### RDoc 模板
@@ -580,7 +590,7 @@ get '/' do
580
590
  end
581
591
  ~~~~
582
592
 
583
- 渲染 `./views/index.rdoc`。
593
+ 这里调用的是 `./views/index.rdoc`。
584
594
 
585
595
  在rdoc中是不可以调用方法的,也不可以传递locals给它。
586
596
  你因此一般会结合其他的渲染引擎来使用它:
@@ -606,7 +616,7 @@ get '/' do
606
616
  end
607
617
  ~~~~
608
618
 
609
- 这将会渲染 `./views/index.rdoc` 并使用 `./views/layout.erb` 作为布局。
619
+ 这将会调用 `./views/index.rdoc` 并使用 `./views/layout.erb` 作为布局。
610
620
 
611
621
  请记住你可以全局设定这个选项:
612
622
 
@@ -618,7 +628,7 @@ get '/' do
618
628
  end
619
629
  ~~~~
620
630
 
621
- 这将会渲染 `./views/index.rdoc` (和任何其他的 RDoc 模版) 并使用
631
+ 这将会调用 `./views/index.rdoc` (和任何其他的 RDoc 模版) 并使用
622
632
  `./views/post.haml` 作为布局.
623
633
 
624
634
  ### Radius 模板
@@ -634,7 +644,7 @@ get '/' do
634
644
  end
635
645
  ~~~~
636
646
 
637
- 渲染 `./views/index.radius`。
647
+ 这里调用的是 `./views/index.radius`。
638
648
 
639
649
  因为你不能在Radius 模板中调用 Ruby 方法 (除了 `yield`) ,
640
650
  你几乎总是需要传递locals给它:
@@ -656,7 +666,7 @@ get '/' do
656
666
  end
657
667
  ~~~~
658
668
 
659
- 渲染 `./views/index.mab`。
669
+ 这里调用的是 `./views/index.mab`。
660
670
 
661
671
  你也可以使用嵌入的 Markaby:
662
672
 
@@ -679,7 +689,7 @@ get '/' do
679
689
  end
680
690
  ~~~~
681
691
 
682
- 渲染 `./views/index.slim`。
692
+ 这里调用的是 `./views/index.slim`。
683
693
 
684
694
  ### Creole 模板
685
695
 
@@ -694,7 +704,7 @@ get '/' do
694
704
  end
695
705
  ~~~~
696
706
 
697
- 渲染 `./views/index.creole`。
707
+ 这里调用的是 `./views/index.creole`。
698
708
 
699
709
  ### CoffeeScript 模板
700
710
 
@@ -711,7 +721,7 @@ end
711
721
  [github.com/josh/ruby-coffee-script](http://github.com/josh/ruby-coffee-script)
712
722
  获取更新的选项。
713
723
 
714
- 现在你可以渲染 CoffeeScript 模版了:
724
+ 现在你可以调用 CoffeeScript 模版了:
715
725
 
716
726
  ~~~~ ruby
717
727
  # 需要在你的应用中引入coffee-script
@@ -722,7 +732,7 @@ get '/application.js' do
722
732
  end
723
733
  ~~~~
724
734
 
725
- 渲染 `./views/application.coffee`。
735
+ 这里调用的是 `./views/application.coffee`。
726
736
 
727
737
  ### 嵌入模板字符串
728
738
 
@@ -732,7 +742,7 @@ get '/' do
732
742
  end
733
743
  ~~~~
734
744
 
735
- 渲染嵌入模板字符串。
745
+ 调用嵌入模板字符串。
736
746
 
737
747
  ### 在模板中访问变量
738
748
 
@@ -836,7 +846,7 @@ get '/' do
836
846
  end
837
847
  ~~~~
838
848
 
839
- 渲染 `./views/index.myat`。察看
849
+ 这里调用的是 `./views/index.myat`。察看
840
850
  [github.com/rtomayko/tilt](https://github.com/rtomayko/tilt)
841
851
  来更多了解Tilt.
842
852
 
@@ -1019,7 +1029,7 @@ end
1019
1029
  如果你希望请求被发送到同一个应用,而不是副本, 使用 `call!` 而不是
1020
1030
  `call`.
1021
1031
 
1022
- 察看 Rack specification 如果你想更多了解 `call`.
1032
+ 如果想更多了解 `call`,请察看 Rack specification
1023
1033
 
1024
1034
  ### 设定 消息体,状态码和消息头
1025
1035
 
@@ -1056,16 +1066,16 @@ end
1056
1066
  如同 `body`, 不带参数的 `headers` 和 `status` 可以用来访问
1057
1067
  他们你的当前值.
1058
1068
 
1059
- ### 媒体类型
1069
+ ### 媒体(MIME)类型
1060
1070
 
1061
- 当使用 `send_file` 或者静态文件的场合,你的媒体类型可能
1062
- Sinatra并不理解。使用 `mime_type` 通过文件扩展名来注册它们:
1071
+ 使用 `send_file` 或者静态文件的时候,Sinatra可能不能识别你的媒体类型。
1072
+ 使用 `mime_type` 通过文件扩展名来注册它们:
1063
1073
 
1064
1074
  ~~~~ ruby
1065
1075
  mime_type :foo, 'text/foo'
1066
1076
  ~~~~
1067
1077
 
1068
- 你也可以通过 `content_type` 辅助方法使用:
1078
+ 你也可以使用 `content_type` 辅助方法:
1069
1079
 
1070
1080
  ~~~~ ruby
1071
1081
  get '/' do
@@ -1082,7 +1092,7 @@ end
1082
1092
  %a{:href => url('/foo')} foo
1083
1093
  ~~~~
1084
1094
 
1085
- 它会根据反向代理和Rack路由,如果有的话,来计算生成的URL
1095
+ 如果使用反向代理和Rack路由,生成URL的时候会考虑这些因素。
1086
1096
 
1087
1097
  这个方法还有一个别名 `to` (见下面的例子).
1088
1098
 
@@ -1096,14 +1106,14 @@ get '/foo' do
1096
1106
  end
1097
1107
  ~~~~
1098
1108
 
1099
- 任何额外的参数都会被以 `halt`相同的方式来处理:
1109
+ 其他参数的用法,与 `halt`相同:
1100
1110
 
1101
1111
  ~~~~ ruby
1102
1112
  redirect to('/bar'), 303
1103
1113
  redirect 'http://google.com', 'wrong place, buddy'
1104
1114
  ~~~~
1105
1115
 
1106
- 你可以方便的通过 `redirect back`把用户重定向到来自的页面:
1116
+ `redirect back`可以把用户重定向到原始页面:
1107
1117
 
1108
1118
  ~~~~ ruby
1109
1119
  get '/foo' do
@@ -1116,13 +1126,13 @@ get '/bar' do
1116
1126
  end
1117
1127
  ~~~~
1118
1128
 
1119
- 为了传递参数给redirect,或者加入query:
1129
+ 如果想传递参数给redirect,可以用query string:
1120
1130
 
1121
1131
  ~~~~ ruby
1122
1132
  redirect to('/bar?sum=42')
1123
1133
  ~~~~
1124
1134
 
1125
- 或者使用session:
1135
+ 或者用session:
1126
1136
 
1127
1137
  ~~~~ ruby
1128
1138
  enable :sessions
@@ -1139,9 +1149,9 @@ end
1139
1149
 
1140
1150
  ### 缓存控制
1141
1151
 
1142
- 正确地设定消息头是恰当的HTTP缓存的基础。
1152
+ 要使用HTTP缓存,必须正确地设定消息头。
1143
1153
 
1144
- 你可以方便的设定 Cache-Control 消息头,像这样:
1154
+ 你可以这样设定 Cache-Control 消息头:
1145
1155
 
1146
1156
  ~~~~ ruby
1147
1157
  get '/' do
@@ -1167,9 +1177,10 @@ before do
1167
1177
  end
1168
1178
  ~~~~
1169
1179
 
1170
- 为了合适地使用缓存,你应该考虑使用 `etag` 和 `last_modified`方法。.
1171
- 推荐在执行繁重任务\*之前\*使用这些helpers
1172
- 他们会立刻发送响应,如果客户端在缓存中已经有了当前版本。
1180
+ 为了合适地使用缓存,你应该考虑使用 `etag` 和 `last_modified`方法。
1181
+ 推荐在执行繁重任务\*之前\*使用这些helpers,这样一来,
1182
+ 如果客户端在缓存中已经有相关内容,就会立即得到显示。
1183
+
1173
1184
 
1174
1185
  ~~~~ ruby
1175
1186
  get '/article/:id' do
@@ -1243,7 +1254,7 @@ send_file 'foo.png', :type => :jpg
1243
1254
  <dd>Content-Length 的值,默认是文件的大小。</dd>
1244
1255
  </dl>
1245
1256
 
1246
- 如果Rack处理器支持,Ruby进程除streaming以外的方式会被使用。
1257
+ 如果Rack处理器支持的话,Ruby进程也能使用除streaming以外的方法。
1247
1258
  如果你使用这个辅助方法, Sinatra会自动处理range请求。
1248
1259
 
1249
1260
  ### 访问请求对象
@@ -2137,3 +2148,11 @@ gem 'activerecord', '~> 3.0' # 也许你还需要 ActiveRecord 3.x
2137
2148
 
2138
2149
  - [IRC: \#sinatra](irc://chat.freenode.net/#sinatra) on
2139
2150
  [freenode.net](http://freenode.net)
2151
+
2152
+ - [Sinatra宝典](http://sinatra-book.gittr.com/) Cookbook教程
2153
+
2154
+ - [Sinatra使用技巧](http://recipes.sinatrarb.com/) 网友贡献的实用技巧
2155
+
2156
+ - [最新版本](http://rubydoc.info/gems/sinatra)API文档;[http://rubydoc.info](http://rubydoc.info)的[当前HEAD](http://rubydoc.info/github/sinatra/sinatra)
2157
+
2158
+ - [CI服务器](http://travis-ci.org/sinatra/sinatra)
data/Rakefile CHANGED
@@ -111,7 +111,7 @@ end
111
111
  desc "list of authors"
112
112
  task :authors, [:commit_range, :format, :sep] do |t, a|
113
113
  a.with_defaults :format => "%s (%d)", :sep => ", ", :commit_range => '--all'
114
- authors = Hash.new { |h,k| h[k] = 0 }
114
+ authors = Hash.new(0)
115
115
  blake = "Blake Mizerany"
116
116
  overall = 0
117
117
  mapping = {
@@ -32,7 +32,7 @@ module Sinatra
32
32
  end
33
33
 
34
34
  def accept?(type)
35
- preferred_type(type).include?(type)
35
+ preferred_type(type).to_s.include?(type)
36
36
  end
37
37
 
38
38
  def preferred_type(*types)
@@ -658,6 +658,7 @@ module Sinatra
658
658
  def initialize
659
659
  super
660
660
  @default_layout = :layout
661
+ @preferred_extension = nil
661
662
  end
662
663
 
663
664
  def erb(template, options = {}, locals = {}, &block)
@@ -715,6 +716,10 @@ module Sinatra
715
716
  render :rdoc, template, options, locals
716
717
  end
717
718
 
719
+ def asciidoc(template, options = {}, locals = {})
720
+ render :asciidoc, template, options, locals
721
+ end
722
+
718
723
  def radius(template, options = {}, locals = {})
719
724
  render :radius, template, options, locals
720
725
  end
@@ -741,6 +746,10 @@ module Sinatra
741
746
  render :creole, template, options, locals
742
747
  end
743
748
 
749
+ def mediawiki(template, options = {}, locals = {})
750
+ render :mediawiki, template, options, locals
751
+ end
752
+
744
753
  def wlang(template, options = {}, locals = {}, &block)
745
754
  render(:wlang, template, options, locals, &block)
746
755
  end
@@ -809,7 +818,7 @@ module Sinatra
809
818
 
810
819
  # render layout
811
820
  if layout
812
- options.merge!(:views => views, :layout => false, :eat_errors => eat_errors, :scope => scope).
821
+ options = options.merge(:views => views, :layout => false, :eat_errors => eat_errors, :scope => scope).
813
822
  merge!(layout_options)
814
823
  catch(:layout_missing) { return render(layout_engine, layout, options, locals) { output } }
815
824
  end
@@ -835,7 +844,7 @@ module Sinatra
835
844
  @preferred_extension = engine.to_s
836
845
  find_template(views, data, template) do |file|
837
846
  path ||= file # keep the initial path rather than the last one
838
- if found = File.exists?(file)
847
+ if found = File.exist?(file)
839
848
  path = file
840
849
  break
841
850
  end
@@ -1015,14 +1024,14 @@ module Sinatra
1015
1024
 
1016
1025
  # Attempt to serve static files from public directory. Throws :halt when
1017
1026
  # a matching file is found, returns nil otherwise.
1018
- def static!
1027
+ def static!(options = {})
1019
1028
  return if (public_dir = settings.public_folder).nil?
1020
1029
  path = File.expand_path("#{public_dir}#{unescape(request.path_info)}" )
1021
1030
  return unless File.file?(path)
1022
1031
 
1023
1032
  env['sinatra.static_file'] = path
1024
1033
  cache_control(*settings.static_cache_control) if settings.static_cache_control?
1025
- send_file path, :disposition => nil
1034
+ send_file path, options.merge(:disposition => nil)
1026
1035
  end
1027
1036
 
1028
1037
  # Enable string or symbol key access to the nested params hash.
@@ -1129,7 +1138,7 @@ module Sinatra
1129
1138
 
1130
1139
  class << self
1131
1140
  CALLERS_TO_IGNORE = [ # :nodoc:
1132
- /\/sinatra(\/(base|main|showexceptions))?\.rb$/, # all sinatra code
1141
+ /\/sinatra(\/(base|main|show_exceptions))?\.rb$/, # all sinatra code
1133
1142
  /lib\/tilt.*\.rb$/, # all tilt code
1134
1143
  /^\(.*\)$/, # generated code
1135
1144
  /rubygems\/(custom|core_ext\/kernel)_require\.rb$/, # rubygems require hacks
@@ -1575,6 +1584,7 @@ module Sinatra
1575
1584
  end
1576
1585
 
1577
1586
  def generate_method(method_name, &block)
1587
+ method_name = method_name.to_sym
1578
1588
  define_method(method_name, &block)
1579
1589
  method = instance_method method_name
1580
1590
  remove_method method_name
@@ -1828,7 +1838,7 @@ module Sinatra
1828
1838
  set :use_code, false
1829
1839
  set :default_encoding, "utf-8"
1830
1840
  set :x_cascade, true
1831
- set :add_charset, %w[javascript xml xhtml+xml json].map { |t| "application/#{t}" }
1841
+ set :add_charset, %w[javascript xml xhtml+xml].map { |t| "application/#{t}" }
1832
1842
  settings.add_charset << /^text\//
1833
1843
 
1834
1844
  # explicitly generating a session secret eagerly to play nice with preforking