sinatra 1.4.5 → 1.4.6

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.

Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHORS.md +77 -0
  3. data/CHANGES +30 -0
  4. data/Gemfile +5 -5
  5. data/README.de.md +186 -56
  6. data/README.es.md +76 -76
  7. data/README.fr.md +120 -56
  8. data/README.hu.md +19 -19
  9. data/README.ja.md +44 -46
  10. data/README.ko.md +163 -67
  11. data/README.md +151 -127
  12. data/README.pt-br.md +905 -144
  13. data/README.pt-pt.md +17 -17
  14. data/README.ru.md +88 -52
  15. data/README.zh.md +76 -68
  16. data/lib/sinatra.rb +0 -1
  17. data/lib/sinatra/base.rb +21 -15
  18. data/lib/sinatra/show_exceptions.rb +10 -4
  19. data/lib/sinatra/version.rb +1 -1
  20. data/sinatra.gemspec +1 -1
  21. data/test/asciidoctor_test.rb +2 -2
  22. data/test/base_test.rb +1 -5
  23. data/test/builder_test.rb +2 -2
  24. data/test/coffee_test.rb +8 -2
  25. data/test/compile_test.rb +1 -1
  26. data/test/contest.rb +3 -12
  27. data/test/creole_test.rb +2 -2
  28. data/test/delegator_test.rb +1 -1
  29. data/test/encoding_test.rb +1 -1
  30. data/test/erb_test.rb +1 -1
  31. data/test/extensions_test.rb +1 -1
  32. data/test/filter_test.rb +2 -2
  33. data/test/haml_test.rb +2 -2
  34. data/test/helper.rb +8 -7
  35. data/test/helpers_test.rb +6 -6
  36. data/test/integration_test.rb +3 -3
  37. data/test/less_test.rb +2 -2
  38. data/test/liquid_test.rb +3 -3
  39. data/test/mapped_error_test.rb +5 -5
  40. data/test/markaby_test.rb +2 -2
  41. data/test/markdown_test.rb +6 -3
  42. data/test/mediawiki_test.rb +2 -2
  43. data/test/middleware_test.rb +1 -1
  44. data/test/nokogiri_test.rb +2 -2
  45. data/test/rabl_test.rb +2 -2
  46. data/test/rack_test.rb +1 -1
  47. data/test/radius_test.rb +2 -2
  48. data/test/rdoc_test.rb +4 -4
  49. data/test/readme_test.rb +1 -1
  50. data/test/request_test.rb +4 -1
  51. data/test/response_test.rb +1 -1
  52. data/test/result_test.rb +2 -2
  53. data/test/route_added_hook_test.rb +1 -1
  54. data/test/routing_test.rb +7 -7
  55. data/test/sass_test.rb +3 -3
  56. data/test/scss_test.rb +2 -2
  57. data/test/server_test.rb +10 -2
  58. data/test/settings_test.rb +4 -4
  59. data/test/sinatra_test.rb +1 -1
  60. data/test/slim_test.rb +2 -2
  61. data/test/static_test.rb +2 -2
  62. data/test/streaming_test.rb +2 -2
  63. data/test/stylus_test.rb +2 -2
  64. data/test/templates_test.rb +3 -3
  65. data/test/textile_test.rb +2 -2
  66. data/test/wlang_test.rb +1 -1
  67. data/test/yajl_test.rb +2 -2
  68. metadata +10 -11
  69. data/AUTHORS +0 -61
@@ -57,8 +57,8 @@ hash `params`:
57
57
  ``` ruby
58
58
  get '/ola/:nome' do
59
59
  # corresponde a "GET /ola/foo" e "GET /ola/bar"
60
- # params[:nome] é 'foo' ou 'bar'
61
- "Olá #{params[:nome]}!"
60
+ # params['nome'] é 'foo' ou 'bar'
61
+ "Olá #{params['nome']}!"
62
62
  end
63
63
  ```
64
64
 
@@ -71,25 +71,25 @@ end
71
71
  ```
72
72
 
73
73
  Padrões de rota podem também incluir parâmetros splat (asteriscos),
74
- acessíveis através do array `params[:splat]`.
74
+ acessíveis através do array `params['splat']`.
75
75
 
76
76
  ``` ruby
77
77
  get '/diga/*/ao/*' do
78
78
  # corresponde a /diga/ola/ao/mundo
79
- params[:splat] # => ["ola", "mundo"]
79
+ params['splat'] # => ["ola", "mundo"]
80
80
  end
81
81
 
82
82
  get '/download/*.*' do
83
83
  # corresponde a /download/pasta/do/arquivo.xml
84
- params[:splat] # => ["pasta/do/arquivo", "xml"]
84
+ params['splat'] # => ["pasta/do/arquivo", "xml"]
85
85
  end
86
86
  ```
87
87
 
88
88
  Rotas correspondem-se com expressões regulares:
89
89
 
90
90
  ``` ruby
91
- get %r{/ola/([\w]+)} do
92
- "Olá, #{params[:captures].first}!"
91
+ get /\A\/ola\/([\w]+)\z/ do
92
+ "Olá, #{params['captures'].first}!"
93
93
  end
94
94
  ```
95
95
 
@@ -106,7 +106,7 @@ exemplo, o agente usuário:
106
106
 
107
107
  ``` ruby
108
108
  get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
109
- "Você está a utilizar a versão #{params[:agent][0]} do Songbird."
109
+ "Você está a utilizar a versão #{params['agent'][0]} do Songbird."
110
110
  end
111
111
 
112
112
  get '/foo' do
@@ -282,7 +282,7 @@ directamente acedidas por templates:
282
282
 
283
283
  ``` ruby
284
284
  get '/:id' do
285
- @foo = Foo.find(params[:id])
285
+ @foo = Foo.find(params['id'])
286
286
  haml '%h1= @foo.nome'
287
287
  end
288
288
  ```
@@ -291,7 +291,7 @@ Ou, especifique um hash explícito para variáveis locais:
291
291
 
292
292
  ``` ruby
293
293
  get '/:id' do
294
- foo = Foo.find(params[:id])
294
+ foo = Foo.find(params['id'])
295
295
  haml '%h1= foo.nome', :locals => { :foo => foo }
296
296
  end
297
297
  ```
@@ -367,7 +367,7 @@ helpers do
367
367
  end
368
368
 
369
369
  get '/:nome' do
370
- bar(params[:nome])
370
+ bar(params['nome'])
371
371
  end
372
372
  ```
373
373
 
@@ -386,7 +386,7 @@ end
386
386
 
387
387
  get '/foo/*' do
388
388
  @nota #=> 'Olá!'
389
- params[:splat] #=> 'bar/baz'
389
+ params['splat'] #=> 'bar/baz'
390
390
  end
391
391
  ```
392
392
 
@@ -454,7 +454,7 @@ usando `pass`:
454
454
 
455
455
  ``` ruby
456
456
  get '/adivinhar/:quem' do
457
- pass unless params[:quem] == 'Frank'
457
+ pass unless params['quem'] == 'Frank'
458
458
  'Apanhaste-me!'
459
459
  end
460
460
 
@@ -518,7 +518,7 @@ obtido a partir da variável Rack `sinatra.error`:
518
518
 
519
519
  ``` ruby
520
520
  error do
521
- 'Peço desculpa, houve um erro desagradável - ' + env['sinatra.error'].name
521
+ 'Peço desculpa, houve um erro desagradável - ' + env['sinatra.error'].message
522
522
  end
523
523
  ```
524
524
 
@@ -586,7 +586,7 @@ content_type :foo
586
586
 
587
587
  ## Middleware Rack
588
588
 
589
- O Sinatra corre no [Rack](http://rack.rubyforge.org/), uma interface
589
+ O Sinatra corre no [Rack](http://rack.github.io/), uma interface
590
590
  padrão mínima para frameworks web em Ruby. Uma das capacidades mais
591
591
  interessantes do Rack, para desenvolver aplicações, é o suporte de
592
592
  “middleware” – componentes que residem entre o servidor e a aplicação,
@@ -609,7 +609,7 @@ end
609
609
  ```
610
610
 
611
611
  A semântica de `use` é idêntica aquela definida para a DSL
612
- [Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html)
612
+ [Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder)
613
613
  (mais frequentemente utilizada para arquivos rackup). Por exemplo, o
614
614
  método `use` aceita múltiplos argumentos/variáveis, bem como blocos:
615
615
 
@@ -635,7 +635,7 @@ framework de teste baseados no Rack.
635
635
  require 'minha_aplicacao_sinatra'
636
636
  require 'rack/test'
637
637
 
638
- class MinhaAplicacaoTeste < Test::Unit::TestCase
638
+ class MinhaAplicacaoTeste < Minitest::Test
639
639
  include Rack::Test::Methods
640
640
 
641
641
  def app
@@ -18,13 +18,13 @@ end
18
18
 
19
19
  Установите gem:
20
20
 
21
- ```
21
+ ``` shell
22
22
  gem install sinatra
23
23
  ```
24
24
 
25
25
  и запустите приложение с помощью:
26
26
 
27
- ```
27
+ ``` shell
28
28
  ruby myapp.rb
29
29
  ```
30
30
 
@@ -82,8 +82,8 @@ end
82
82
  ```ruby
83
83
  get '/hello/:name' do
84
84
  # соответствует "GET /hello/foo" и "GET /hello/bar",
85
- # где params[:name] 'foo' или 'bar'
86
- "Hello #{params[:name]}!"
85
+ # где params['name'] 'foo' или 'bar'
86
+ "Hello #{params['name']}!"
87
87
  end
88
88
  ```
89
89
 
@@ -96,17 +96,17 @@ end
96
96
  ```
97
97
 
98
98
  Шаблоны маршрутов также могут включать в себя splat (или '*' маску,
99
- обозначающую любой символ) параметры, доступные в массиве `params[:splat]`:
99
+ обозначающую любой символ) параметры, доступные в массиве `params['splat']`:
100
100
 
101
101
  ```ruby
102
102
  get '/say/*/to/*' do
103
103
  # соответствует /say/hello/to/world
104
- params[:splat] # => ["hello", "world"]
104
+ params['splat'] # => ["hello", "world"]
105
105
  end
106
106
 
107
107
  get '/download/*.*' do
108
108
  # соответствует /download/path/to/file.xml
109
- params[:splat] # => ["path/to/file", "xml"]
109
+ params['splat'] # => ["path/to/file", "xml"]
110
110
  end
111
111
  ```
112
112
 
@@ -121,14 +121,15 @@ end
121
121
  Регулярные выражения в качестве шаблонов маршрутов:
122
122
 
123
123
  ```ruby
124
- get %r{/hello/([\w]+)} do
125
- "Hello, #{params[:captures].first}!"
124
+ get /\A\/hello\/([\w]+)\z/ do
125
+ "Hello, #{params['captures'].first}!"
126
126
  end
127
127
  ```
128
128
 
129
129
  Или с параметром блока:
130
130
 
131
131
  ```ruby
132
+ # Находит "GET /meta/hello/world", "GET /hello/world/1234" и так далее
132
133
  get %r{/hello/([\w]+)} do |c|
133
134
  "Hello, #{c}!"
134
135
  end
@@ -153,7 +154,7 @@ traversal, см. ниже), путь запроса может быть изме
153
154
 
154
155
  ```ruby
155
156
  get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
156
- "You're using Songbird version #{params[:agent][0]}"
157
+ "You're using Songbird version #{params['agent'][0]}"
157
158
  end
158
159
 
159
160
  get '/foo' do
@@ -487,7 +488,7 @@ get('/') { markdown :index }
487
488
  <tr>
488
489
  <td>Зависимости</td>
489
490
  <td>
490
- <a href="http://builder.rubyforge.org/" title="builder">builder</a>
491
+ <a href="https://github.com/jimweirich/builder" title="builder">builder</a>
491
492
  </td>
492
493
  </tr>
493
494
  <tr>
@@ -602,8 +603,8 @@ get('/') { markdown :index }
602
603
  <a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
603
604
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
604
605
  <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
605
- <a href="http://kramdown.rubyforge.org/" title="kramdown">kramdown</a>,
606
- <a href="http://maruku.rubyforge.org/" title="maruku">maruku</a>
606
+ <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
607
+ <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
607
608
  </td>
608
609
  </tr>
609
610
  <tr>
@@ -678,7 +679,7 @@ erb :overview, :locals => { :text => textile(:introduction) }
678
679
  <table>
679
680
  <tr>
680
681
  <td>Зависимости</td>
681
- <td><a href="http://rdoc.rubyforge.org/" title="RDoc">RDoc</a></td>
682
+ <td><a href="http://rdoc.sourceforge.net/" title="RDoc">RDoc</a></td>
682
683
  </tr>
683
684
  <tr>
684
685
  <td>Расширения файлов</td>
@@ -735,7 +736,7 @@ erb :overview, :locals => { :text => rdoc(:introduction) }
735
736
  <table>
736
737
  <tr>
737
738
  <td>Зависимости</td>
738
- <td><a href="http://radius.rubyforge.org/" title="Radius">Radius</a></td>
739
+ <td><a href="https://github.com/jlong/radius" title="Radius">Radius</a></td>
739
740
  </tr>
740
741
  <tr>
741
742
  <td>Расширения файлов</td>
@@ -885,9 +886,9 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
885
886
  <td>
886
887
  <a href="https://github.com/josh/ruby-coffee-script" title="Ruby CoffeeScript">
887
888
  CoffeeScript
888
- </a> и способ
889
+ </a> и
889
890
  <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
890
- запускать JavaScript
891
+ способ запускать JavaScript
891
892
  </a>
892
893
  </td>
893
894
  </tr>
@@ -901,6 +902,43 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
901
902
  </tr>
902
903
  </table>
903
904
 
905
+ #### Stylus шаблоны
906
+
907
+ <table>
908
+ <tr>
909
+ <td>Зависимости</td>
910
+ <td>
911
+ <a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
912
+ Stylus
913
+ </a> и
914
+ <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
915
+ способ запускать JavaScript
916
+ </a>
917
+ </td>
918
+ </tr>
919
+ <tr>
920
+ <td>Расширение файла</td>
921
+ <td><tt>.styl</tt></td>
922
+ </tr>
923
+ <tr>
924
+ <td>Пример</td>
925
+ <td><tt>stylus :index</tt></td>
926
+ </tr>
927
+ </table>
928
+
929
+ Перед тем, как использовать шаблоны стилус, загрузите `stylus` и
930
+ `stylus/tilt`:
931
+
932
+ ``` ruby
933
+ require 'sinatra'
934
+ require 'stylus'
935
+ require 'stylus/tilt'
936
+
937
+ get '/' do
938
+ stylus :example
939
+ end
940
+ ```
941
+
904
942
  #### Yajl шаблоны
905
943
 
906
944
  <table>
@@ -969,7 +1007,7 @@ var resource = {"foo":"bar","baz":"qux"}; present(resource);
969
1007
 
970
1008
  ```ruby
971
1009
  get '/:id' do
972
- @foo = Foo.find(params[:id])
1010
+ @foo = Foo.find(params['id'])
973
1011
  haml '%h1= @foo.name'
974
1012
  end
975
1013
  ```
@@ -978,7 +1016,7 @@ end
978
1016
 
979
1017
  ```ruby
980
1018
  get '/:id' do
981
- foo = Foo.find(params[:id])
1019
+ foo = Foo.find(params['id'])
982
1020
  haml '%h1= bar.name', :locals => { :bar => foo }
983
1021
  end
984
1022
  ```
@@ -1122,7 +1160,7 @@ end
1122
1160
 
1123
1161
  get '/foo/*' do
1124
1162
  @note #=> 'Hi!'
1125
- params[:splat] #=> 'bar/baz'
1163
+ params['splat'] #=> 'bar/baz'
1126
1164
  end
1127
1165
  ```
1128
1166
 
@@ -1150,7 +1188,7 @@ before '/protected/*' do
1150
1188
  end
1151
1189
 
1152
1190
  after '/create/:slug' do |slug|
1153
- session[:last_slug] = slug
1191
+ session['last_slug'] = slug
1154
1192
  end
1155
1193
  ```
1156
1194
 
@@ -1179,7 +1217,7 @@ helpers do
1179
1217
  end
1180
1218
 
1181
1219
  get '/:name' do
1182
- bar(params[:name])
1220
+ bar(params['name'])
1183
1221
  end
1184
1222
  ```
1185
1223
 
@@ -1208,11 +1246,11 @@ helpers FooUtils, BarUtils
1208
1246
  enable :sessions
1209
1247
 
1210
1248
  get '/' do
1211
- "value = " << session[:value].inspect
1249
+ "value = " << session['value'].inspect
1212
1250
  end
1213
1251
 
1214
1252
  get '/:value' do
1215
- session[:value] = params[:value]
1253
+ session['value'] = params['value']
1216
1254
  end
1217
1255
  ```
1218
1256
 
@@ -1227,11 +1265,11 @@ end
1227
1265
  use Rack::Session::Pool, :expire_after => 2592000
1228
1266
 
1229
1267
  get '/' do
1230
- "value = " << session[:value].inspect
1268
+ "value = " << session['value'].inspect
1231
1269
  end
1232
1270
 
1233
1271
  get '/:value' do
1234
- session[:value] = params[:value]
1272
+ session['value'] = params['value']
1235
1273
  end
1236
1274
  ```
1237
1275
 
@@ -1305,7 +1343,7 @@ halt erb(:error)
1305
1343
 
1306
1344
  ```ruby
1307
1345
  get '/guess/:who' do
1308
- pass unless params[:who] == 'Frank'
1346
+ pass unless params['who'] == 'Frank'
1309
1347
  'You got me!'
1310
1348
  end
1311
1349
 
@@ -1426,19 +1464,17 @@ connections = []
1426
1464
 
1427
1465
  get '/subscribe' do
1428
1466
  # регистрация клиента
1429
- stream(:keep_open) { |out| connections << out }
1430
-
1431
- # удаление "мертвых клиентов"
1432
- connections.reject!(&:closed?)
1433
-
1434
- # допуск
1435
- "subscribed"
1467
+ stream(:keep_open) do |out|
1468
+ connections << out }
1469
+ # удаление "мертвых клиентов"
1470
+ connections.reject!(&:closed?)
1471
+ end
1436
1472
  end
1437
1473
 
1438
1474
  post '/message' do
1439
1475
  connections.each do |out|
1440
1476
  # уведомить клиента о новом сообщении
1441
- out << params[:message] << "\n"
1477
+ out << params['message'] << "\n"
1442
1478
 
1443
1479
  # указать клиенту на необходимость снова соединиться
1444
1480
  out.close
@@ -1561,12 +1597,12 @@ redirect to('/bar?sum=42')
1561
1597
  enable :sessions
1562
1598
 
1563
1599
  get '/foo' do
1564
- session[:secret] = 'foo'
1600
+ session['secret'] = 'foo'
1565
1601
  redirect to('/bar')
1566
1602
  end
1567
1603
 
1568
1604
  get '/bar' do
1569
- session[:secret]
1605
+ session['secret']
1570
1606
  end
1571
1607
  ```
1572
1608
 
@@ -1607,7 +1643,7 @@ end
1607
1643
 
1608
1644
  ```ruby
1609
1645
  get '/article/:id' do
1610
- @article = Article.find params[:id]
1646
+ @article = Article.find params['id']
1611
1647
  last_modified @article.updated_at
1612
1648
  etag @article.sha1
1613
1649
  erb :article
@@ -1803,7 +1839,7 @@ end
1803
1839
  ```
1804
1840
 
1805
1841
  Этот метод используется внутри Sinatra методами `expires`, `last_modified` и
1806
- им подобными. Поэтому вы легко можете расширить функционал этих методов,
1842
+ им подобными. Поэтому вы легко можете изменить и дополнить поведение этих методов,
1807
1843
  переопределив `time_for` в своем приложении:
1808
1844
 
1809
1845
  ```ruby
@@ -1970,11 +2006,11 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1970
2006
  </dd>
1971
2007
  <dd>Отключено по умолчанию.</dd>
1972
2008
 
1973
- <dt>add_charsets</dt>
2009
+ <dt>add_charset</dt>
1974
2010
  <dd>
1975
2011
  mime-типы, к которым метод <tt>content_type</tt> будет автоматически добавлять
1976
2012
  информацию о кодировке. Вам следует добавлять значения к этой опции
1977
- вместо ее переопределения: <tt>settings.add_charsets &lt;&lt; "application/foobar"</tt>
2013
+ вместо ее переопределения: <tt>settings.add_charset &lt;&lt; "application/foobar"</tt>
1978
2014
  </dd>
1979
2015
 
1980
2016
  <dt>app_file</dt>
@@ -2158,7 +2194,7 @@ not_found do
2158
2194
  end
2159
2195
  ```
2160
2196
 
2161
- ### Ошибки
2197
+ ### Error
2162
2198
 
2163
2199
  Обработчик ошибок `error` будет вызван, когда исключение выброшено из блока
2164
2200
  маршрута, либо из фильтра. Объект-исключение доступен как переменная
@@ -2166,7 +2202,7 @@ end
2166
2202
 
2167
2203
  ```ruby
2168
2204
  error do
2169
- 'Sorry there was a nasty error - ' + env['sinatra.error'].name
2205
+ 'Sorry there was a nasty error - ' + env['sinatra.error'].message
2170
2206
  end
2171
2207
  ```
2172
2208
 
@@ -2217,7 +2253,7 @@ Sinatra устанавливает специальные `not_found` и `error`
2217
2253
 
2218
2254
  ## Rack "прослойки"
2219
2255
 
2220
- Sinatra использует [Rack](http://rack.rubyforge.org/), минимальный стандартный
2256
+ Sinatra использует [Rack](http://rack.github.io/), минимальный стандартный
2221
2257
  интерфейс для веб-фреймворков на Ruby. Одной из самых интересных для
2222
2258
  разработчиков возможностей Rack является поддержка "прослоек" ("middleware") —
2223
2259
  компонентов, находящихся "между" сервером и вашим приложением, которые
@@ -2239,7 +2275,7 @@ end
2239
2275
  ```
2240
2276
 
2241
2277
  Семантика `use` идентична той, что определена для
2242
- [Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html) DSL
2278
+ [Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder) DSL
2243
2279
  (чаще всего используется в rackup файлах). Например, метод `use` принимает как
2244
2280
  множественные переменные, так и блоки:
2245
2281
 
@@ -2269,10 +2305,10 @@ Rack распространяется с различными стандартн
2269
2305
 
2270
2306
  ```ruby
2271
2307
  require 'my_sinatra_app'
2272
- require 'test/unit'
2308
+ require 'minitest/autorun'
2273
2309
  require 'rack/test'
2274
2310
 
2275
- class MyAppTest < Test::Unit::TestCase
2311
+ class MyAppTest < Minitest::Test
2276
2312
  include Rack::Test::Methods
2277
2313
 
2278
2314
  def app
@@ -2447,8 +2483,8 @@ class LoginScreen < Sinatra::Base
2447
2483
  get('/login') { haml :login }
2448
2484
 
2449
2485
  post('/login') do
2450
- if params[:name] == 'admin' && params[:password] == 'admin'
2451
- session['user_name'] = params[:name]
2486
+ if params['name'] == 'admin' && params['password'] == 'admin'
2487
+ session['user_name'] = params['name']
2452
2488
  else
2453
2489
  redirect '/login'
2454
2490
  end
@@ -2574,8 +2610,8 @@ class MyApp < Sinatra::Base
2574
2610
  # Область видимости запроса '/define_route/:name'
2575
2611
  @value = 42
2576
2612
 
2577
- settings.get("/#{params[:name]}") do
2578
- # Область видимости запроса "/#{params[:name]}"
2613
+ settings.get("/#{params['name']}") do
2614
+ # Область видимости запроса "/#{params['name']}"
2579
2615
  @value # => nil (другой запрос)
2580
2616
  end
2581
2617
 
@@ -2791,7 +2827,7 @@ SemVerTag.
2791
2827
  * [Twitter](http://twitter.com/sinatra)
2792
2828
  * [Группы рассылки](http://groups.google.com/group/sinatrarb/topics)
2793
2829
  * [#sinatra](irc://chat.freenode.net/#sinatra) на http://freenode.net
2794
- * [Sinatra Book](http://sinatra-book.gittr.com) учебник и сборник рецептов
2830
+ * [Sinatra Book](https://github.com/sinatra/sinatra-book/) учебник и сборник рецептов
2795
2831
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) сборник рецептов
2796
2832
  * API документация к [последнему релизу](http://rubydoc.info/gems/sinatra)
2797
2833
  или [текущему HEAD](http://rubydoc.info/github/sinatra/sinatra) на