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.
- checksums.yaml +4 -4
- data/AUTHORS.md +77 -0
- data/CHANGES +30 -0
- data/Gemfile +5 -5
- data/README.de.md +186 -56
- data/README.es.md +76 -76
- data/README.fr.md +120 -56
- data/README.hu.md +19 -19
- data/README.ja.md +44 -46
- data/README.ko.md +163 -67
- data/README.md +151 -127
- data/README.pt-br.md +905 -144
- data/README.pt-pt.md +17 -17
- data/README.ru.md +88 -52
- data/README.zh.md +76 -68
- data/lib/sinatra.rb +0 -1
- data/lib/sinatra/base.rb +21 -15
- data/lib/sinatra/show_exceptions.rb +10 -4
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +1 -1
- data/test/asciidoctor_test.rb +2 -2
- data/test/base_test.rb +1 -5
- data/test/builder_test.rb +2 -2
- data/test/coffee_test.rb +8 -2
- data/test/compile_test.rb +1 -1
- data/test/contest.rb +3 -12
- data/test/creole_test.rb +2 -2
- data/test/delegator_test.rb +1 -1
- data/test/encoding_test.rb +1 -1
- data/test/erb_test.rb +1 -1
- data/test/extensions_test.rb +1 -1
- data/test/filter_test.rb +2 -2
- data/test/haml_test.rb +2 -2
- data/test/helper.rb +8 -7
- data/test/helpers_test.rb +6 -6
- data/test/integration_test.rb +3 -3
- data/test/less_test.rb +2 -2
- data/test/liquid_test.rb +3 -3
- data/test/mapped_error_test.rb +5 -5
- data/test/markaby_test.rb +2 -2
- data/test/markdown_test.rb +6 -3
- data/test/mediawiki_test.rb +2 -2
- data/test/middleware_test.rb +1 -1
- data/test/nokogiri_test.rb +2 -2
- data/test/rabl_test.rb +2 -2
- data/test/rack_test.rb +1 -1
- data/test/radius_test.rb +2 -2
- data/test/rdoc_test.rb +4 -4
- data/test/readme_test.rb +1 -1
- data/test/request_test.rb +4 -1
- data/test/response_test.rb +1 -1
- data/test/result_test.rb +2 -2
- data/test/route_added_hook_test.rb +1 -1
- data/test/routing_test.rb +7 -7
- data/test/sass_test.rb +3 -3
- data/test/scss_test.rb +2 -2
- data/test/server_test.rb +10 -2
- data/test/settings_test.rb +4 -4
- data/test/sinatra_test.rb +1 -1
- data/test/slim_test.rb +2 -2
- data/test/static_test.rb +2 -2
- data/test/streaming_test.rb +2 -2
- data/test/stylus_test.rb +2 -2
- data/test/templates_test.rb +3 -3
- data/test/textile_test.rb +2 -2
- data/test/wlang_test.rb +1 -1
- data/test/yajl_test.rb +2 -2
- metadata +10 -11
- data/AUTHORS +0 -61
data/README.pt-pt.md
CHANGED
@@ -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[
|
61
|
-
"Olá #{params[
|
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[
|
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[
|
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[
|
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
|
92
|
-
"Olá, #{params[
|
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[
|
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[
|
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[
|
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[
|
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[
|
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[
|
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'].
|
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.
|
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://
|
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
|
638
|
+
class MinhaAplicacaoTeste < Minitest::Test
|
639
639
|
include Rack::Test::Methods
|
640
640
|
|
641
641
|
def app
|
data/README.ru.md
CHANGED
@@ -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[
|
86
|
-
"Hello #{params[
|
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[
|
99
|
+
обозначающую любой символ) параметры, доступные в массиве `params['splat']`:
|
100
100
|
|
101
101
|
```ruby
|
102
102
|
get '/say/*/to/*' do
|
103
103
|
# соответствует /say/hello/to/world
|
104
|
-
params[
|
104
|
+
params['splat'] # => ["hello", "world"]
|
105
105
|
end
|
106
106
|
|
107
107
|
get '/download/*.*' do
|
108
108
|
# соответствует /download/path/to/file.xml
|
109
|
-
params[
|
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
|
125
|
-
"Hello, #{params[
|
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[
|
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="
|
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.
|
606
|
-
<a href="
|
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.
|
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="
|
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[
|
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[
|
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[
|
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[
|
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[
|
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[
|
1249
|
+
"value = " << session['value'].inspect
|
1212
1250
|
end
|
1213
1251
|
|
1214
1252
|
get '/:value' do
|
1215
|
-
session[
|
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[
|
1268
|
+
"value = " << session['value'].inspect
|
1231
1269
|
end
|
1232
1270
|
|
1233
1271
|
get '/:value' do
|
1234
|
-
session[
|
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[
|
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)
|
1430
|
-
|
1431
|
-
|
1432
|
-
|
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[
|
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[
|
1600
|
+
session['secret'] = 'foo'
|
1565
1601
|
redirect to('/bar')
|
1566
1602
|
end
|
1567
1603
|
|
1568
1604
|
get '/bar' do
|
1569
|
-
session[
|
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[
|
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>
|
2009
|
+
<dt>add_charset</dt>
|
1974
2010
|
<dd>
|
1975
2011
|
mime-типы, к которым метод <tt>content_type</tt> будет автоматически добавлять
|
1976
2012
|
информацию о кодировке. Вам следует добавлять значения к этой опции
|
1977
|
-
вместо ее переопределения: <tt>settings.
|
2013
|
+
вместо ее переопределения: <tt>settings.add_charset << "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'].
|
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.
|
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://
|
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 '
|
2308
|
+
require 'minitest/autorun'
|
2273
2309
|
require 'rack/test'
|
2274
2310
|
|
2275
|
-
class MyAppTest < Test
|
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[
|
2451
|
-
session['user_name'] = params[
|
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[
|
2578
|
-
# Область видимости запроса "/#{params[
|
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](
|
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) на
|