sinatra 2.0.1 → 2.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a481c0ba22e73031a7669f68358463db3b92ea47
4
- data.tar.gz: 9ad051aed2a9b41ffc3c92bcec42aa0e8d99a7b8
2
+ SHA256:
3
+ metadata.gz: c6c73742bb14264358d852a59585930faced4fd019996e0674cdd21d92af01ee
4
+ data.tar.gz: 4c0ecbfcae07c5fdb8f4e704ca6e6a5ad49bb28e329a59c4dc60e2312673927f
5
5
  SHA512:
6
- metadata.gz: 15a8af507cdc873476fbbfd81d502b39c2f4467c08c7cc6c2b7dde29f7b5ff9dbe3ac7bc9259577c15153a00952e5477fede62546d8db2791b1615edc2a12598
7
- data.tar.gz: ea93478022eb8bedde7b3dfc66dc7077c6264022a3da196cc6b9ca927b91c5700c4f1f24f1b03f3e5fe74723897d59e93e25f6fa0f54ecd28d6a6299c0a977a0
6
+ metadata.gz: 82b602487159d2c84a74442b7220d63130113f95a73f762ee6103f7fa569eb79e95a0e77e496ca12700a751e4ce13b6fe3d6daa6ce82f1a509073d3ae0152259
7
+ data.tar.gz: 0cc9adf3922c8d471c1176667299debc529129194b68dba70f3041c73d339ee18344a479a0d6d9a239918d3a0dc3d5688b55c749a00900b3b8bb0e0081f0deb3
@@ -1,86 +1,108 @@
1
+ ## 2.0.2 / 2018-06-05
2
+
3
+ * Escape invalid query parameters [#1432](https://github.com/sinatra/sinatra/issues/1432) by Kunpei Sakai
4
+ * The patch fixes [CVE-2018-11627](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-11627).
5
+
6
+ * Fix undefined method error for `Sinatra::RequiredParams` with hash key [#1431](https://github.com/sinatra/sinatra/issues/1431) by Arpit Chauhan
7
+
8
+ * Add xml content-types to valid html_types for Rack::Protection [#1413](https://github.com/sinatra/sinatra/issues/1413) by Reenan Arbitrario
9
+
10
+ * Encode route parameters using :default_encoding setting [#1412](https://github.com/sinatra/sinatra/issues/1412) by Brian m. Carlson
11
+
12
+ * Fix unpredictable behaviour from Sinatra::ConfigFile [#1244](https://github.com/sinatra/sinatra/issues/1244) by John Hope
13
+
14
+ * Add Sinatra::IndifferentHash#slice [#1405](https://github.com/sinatra/sinatra/issues/1405) by Shota Iguchi
15
+
16
+ * Remove status code 205 from drop body response [#1398](https://github.com/sinatra/sinatra/issues/1398) by Shota Iguchi
17
+
18
+ * Ignore empty captures from params [#1390](https://github.com/sinatra/sinatra/issues/1390) by Shota Iguchi
19
+
20
+ * Improve development support and documentation and source code by Zp Yuan, Andreas Finger, Olle Jonsson, Shota Iguchi, Nikita Bulai and Joshua O'Brien
21
+
1
22
  ## 2.0.1 / 2018-02-17
2
23
 
3
- * Repair nested namespaces, by avoiding prefix duplication #1322. Fixes #1310 by Kunpei Sakai
24
+ * Repair nested namespaces, by avoiding prefix duplication [#1322](https://github.com/sinatra/sinatra/issues/1322). Fixes [#1310](https://github.com/sinatra/sinatra/issues/1310) by Kunpei Sakai
4
25
 
5
- * Add pattern matches to values for Mustermann::Concat #1333. Fixes #1332 by Dawa Ometto
26
+ * Add pattern matches to values for Mustermann::Concat [#1333](https://github.com/sinatra/sinatra/issues/1333). Fixes [#1332](https://github.com/sinatra/sinatra/issues/1332) by Dawa Ometto
6
27
 
7
- * Ship the VERSION file with the gem, to allow local unpacking #1338 by Olle Jonsson
28
+ * Ship the VERSION file with the gem, to allow local unpacking [#1338](https://github.com/sinatra/sinatra/issues/1338) by Olle Jonsson
8
29
 
9
- * Fix issue with custom error handler on bad request #1351. Fixes #1350 by Jordan Owens
30
+ * Fix issue with custom error handler on bad request [#1351](https://github.com/sinatra/sinatra/issues/1351). Fixes [#1350](https://github.com/sinatra/sinatra/issues/1350) by Jordan Owens
10
31
 
11
- * Override Rack::ShowExceptions#pretty to set custom template #1377. Fixes #1376 by Jordan Owens
32
+ * Override Rack::ShowExceptions#pretty to set custom template [#1377](https://github.com/sinatra/sinatra/issues/1377). Fixes [#1376](https://github.com/sinatra/sinatra/issues/1376) by Jordan Owens
12
33
 
13
- * Enhanced path validation in Windows #1379 by Orange Tsai
34
+ * Enhanced path validation in Windows [#1379](https://github.com/sinatra/sinatra/issues/1379) by Orange Tsai from DEVCORE
35
+ * The patch fixes [CVE-2018-7212](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7212)
14
36
 
15
37
  * Improve development support and documentation by Faheel Ahmad, Shota Iguchi, Olle Jonsson, Manabu Niseki, John Hope, Horacio, Ice-Storm, GraniteRock, Raman Skaskevich, Carlos Azuaje, 284km, Dan Rice and Zachary Scott
16
38
 
17
39
  ## 2.0.0 / 2017-04-10
18
40
 
19
- * Use Mustermann for patterns #1086 by Konstantin Haase
41
+ * Use Mustermann for patterns [#1086](https://github.com/sinatra/sinatra/issues/1086) by Konstantin Haase
20
42
 
21
- * Server now provides `-q` flag for quiet mode, which disables start/stop messages #1153 by Vasiliy.
43
+ * Server now provides `-q` flag for quiet mode, which disables start/stop messages [#1153](https://github.com/sinatra/sinatra/issues/1153) by Vasiliy.
22
44
 
23
- * Session middleware can now be specified with `:session_store` setting #1161 by Jordan Owens.
45
+ * Session middleware can now be specified with `:session_store` setting [#1161](https://github.com/sinatra/sinatra/issues/1161) by Jordan Owens.
24
46
 
25
- * `APP_ENV` is now preferred and recommended over `RACK_ENV` for setting environment #984 by Damien Mathieu.
47
+ * `APP_ENV` is now preferred and recommended over `RACK_ENV` for setting environment [#984](https://github.com/sinatra/sinatra/issues/984) by Damien Mathieu.
26
48
 
27
- * Add Reel support #793 by Patricio Mac Adden.
49
+ * Add Reel support [#793](https://github.com/sinatra/sinatra/issues/793) by Patricio Mac Adden.
28
50
 
29
- * Make route params available during error handling #895 by Jeremy Evans.
51
+ * Make route params available during error handling [#895](https://github.com/sinatra/sinatra/issues/895) by Jeremy Evans.
30
52
 
31
- * Unify `not_found` and `error` 404 behavior #896 by Jeremy Evans.
53
+ * Unify `not_found` and `error` 404 behavior [#896](https://github.com/sinatra/sinatra/issues/896) by Jeremy Evans.
32
54
 
33
- * Enable Ruby 2.3 `frozen_string_literal` feature #1076 by Vladimir Kochnev.
55
+ * Enable Ruby 2.3 `frozen_string_literal` feature [#1076](https://github.com/sinatra/sinatra/issues/1076) by Vladimir Kochnev.
34
56
 
35
57
  * Add Sinatra::ShowExceptions::TEMPLATE and patched Rack::ShowExceptions to prefer Sinatra template by Zachary Scott.
36
58
 
37
- * Sinatra::Runner is used internally for integration tests #840 by Nick Sutterer.
59
+ * Sinatra::Runner is used internally for integration tests [#840](https://github.com/sinatra/sinatra/issues/840) by Nick Sutterer.
38
60
 
39
- * Fix case-sensitivity issue in `uri` method #889 by rennex.
61
+ * Fix case-sensitivity issue in `uri` method [#889](https://github.com/sinatra/sinatra/issues/889) by rennex.
40
62
 
41
- * Use `Rack::Utils.status_code` to allow `status` helper to use symbol as well as numeric codes #968 by Tobias H. Michaelsen.
63
+ * Use `Rack::Utils.status_code` to allow `status` helper to use symbol as well as numeric codes [#968](https://github.com/sinatra/sinatra/issues/968) by Tobias H. Michaelsen.
42
64
 
43
- * Improved error handling for invalid params through Rack #1070 by Jordan Owens.
65
+ * Improved error handling for invalid params through Rack [#1070](https://github.com/sinatra/sinatra/issues/1070) by Jordan Owens.
44
66
 
45
- * Ensure template is cached only once #1021 by Patrik Rak.
67
+ * Ensure template is cached only once [#1021](https://github.com/sinatra/sinatra/issues/1021) by Patrik Rak.
46
68
 
47
- * Rack middleware is initialized at server runtime rather than after receiving first request #1205 by Itamar Turner-Trauring.
69
+ * Rack middleware is initialized at server runtime rather than after receiving first request [#1205](https://github.com/sinatra/sinatra/issues/1205) by Itamar Turner-Trauring.
48
70
 
49
- * Improve Session Secret documentation to encourage better security practices #1218 by Glenn Rempe
71
+ * Improve Session Secret documentation to encourage better security practices [#1218](https://github.com/sinatra/sinatra/issues/1218) by Glenn Rempe
50
72
 
51
- * Exposed global and per-route options for Mustermann route parsing #1233 by Mike Pastore
73
+ * Exposed global and per-route options for Mustermann route parsing [#1233](https://github.com/sinatra/sinatra/issues/1233) by Mike Pastore
52
74
 
53
- * Use same `session_secret` for classic and modular apps in development #1245 by Marcus Stollsteimer
75
+ * Use same `session_secret` for classic and modular apps in development [#1245](https://github.com/sinatra/sinatra/issues/1245) by Marcus Stollsteimer
54
76
 
55
- * Make authenticity token length a fixed value of 32 #1181 by Jordan Owens
77
+ * Make authenticity token length a fixed value of 32 [#1181](https://github.com/sinatra/sinatra/issues/1181) by Jordan Owens
56
78
 
57
- * Modernize Rack::Protection::ContentSecurityPolicy with CSP Level 2 and 3 Directives #1202 by Glenn Rempe
79
+ * Modernize Rack::Protection::ContentSecurityPolicy with CSP Level 2 and 3 Directives [#1202](https://github.com/sinatra/sinatra/issues/1202) by Glenn Rempe
58
80
 
59
- * Adds preload option to Rack:Protection:StrictTransport #1209 by Ed Robinson
81
+ * Adds preload option to Rack:Protection:StrictTransport [#1209](https://github.com/sinatra/sinatra/issues/1209) by Ed Robinson
60
82
 
61
- * Improve BadRequest logic. Raise and handle exceptions if status is 400 #1212 by Mike Pastore
83
+ * Improve BadRequest logic. Raise and handle exceptions if status is 400 [#1212](https://github.com/sinatra/sinatra/issues/1212) by Mike Pastore
62
84
 
63
- * Make Rack::Test a development dependency #1232 by Mike Pastore
85
+ * Make Rack::Test a development dependency [#1232](https://github.com/sinatra/sinatra/issues/1232) by Mike Pastore
64
86
 
65
- * Capture exception messages of raised NotFound and BadRequest #1210 by Mike Pastore
87
+ * Capture exception messages of raised NotFound and BadRequest [#1210](https://github.com/sinatra/sinatra/issues/1210) by Mike Pastore
66
88
 
67
- * Add explicit set method to contrib/cookies to override cookie settings #1240 by Andrew Allen
89
+ * Add explicit set method to contrib/cookies to override cookie settings [#1240](https://github.com/sinatra/sinatra/issues/1240) by Andrew Allen
68
90
 
69
- * Avoid executing filters even if prefix matches with other namespace #1253 by namusyaka
91
+ * Avoid executing filters even if prefix matches with other namespace [#1253](https://github.com/sinatra/sinatra/issues/1253) by namusyaka
70
92
 
71
- * Make `#has_key?` also indifferent in access, can accept String or Symbol #1262 by Stephen Paul Weber
93
+ * Make `#has_key?` also indifferent in access, can accept String or Symbol [#1262](https://github.com/sinatra/sinatra/issues/1262) by Stephen Paul Weber
72
94
 
73
- * Add `allow_if` option to bypass json csrf protection #1265 by Jordan Owens
95
+ * Add `allow_if` option to bypass json csrf protection [#1265](https://github.com/sinatra/sinatra/issues/1265) by Jordan Owens
74
96
 
75
- * rack-protection: Bundle StrictTransport, CookieTossing, and CSP #1267 by Mike Pastore
97
+ * rack-protection: Bundle StrictTransport, CookieTossing, and CSP [#1267](https://github.com/sinatra/sinatra/issues/1267) by Mike Pastore
76
98
 
77
- * Add `:strict_paths` option for managing trailing slashes #1273 by namusyaka
99
+ * Add `:strict_paths` option for managing trailing slashes [#1273](https://github.com/sinatra/sinatra/issues/1273) by namusyaka
78
100
 
79
- * Add full IndifferentHash implementation to params #1279 by Mike Pastore
101
+ * Add full IndifferentHash implementation to params [#1279](https://github.com/sinatra/sinatra/issues/1279) by Mike Pastore
80
102
 
81
103
  ## 1.4.8 / 2017-01-30
82
104
 
83
- * Fix the deprecation warning from Ruby about Fixnum. #1235 by Akira Matsuda
105
+ * Fix the deprecation warning from Ruby about Fixnum. [#1235](https://github.com/sinatra/sinatra/issues/1235) by Akira Matsuda
84
106
 
85
107
  ## 1.4.7 / 2016-01-24
86
108
 
@@ -88,14 +110,14 @@
88
110
 
89
111
  * Correctly handle encoded colons in routes. (Jeremy Evans)
90
112
 
91
- * Rename CHANGES to CHANGELOG.md and update Rakefile. #1043 (Eliza Sorensen)
113
+ * Rename CHANGES to CHANGELOG.md and update Rakefile. [#1043](https://github.com/sinatra/sinatra/issues/1043) (Eliza Sorensen)
92
114
 
93
- * Improve documentation. #941, #1069, #1075, #1025, #1052 (Many great folks)
115
+ * Improve documentation. [#941](https://github.com/sinatra/sinatra/issues/941), [#1069](https://github.com/sinatra/sinatra/issues/1069), [#1075](https://github.com/sinatra/sinatra/issues/1075), [#1025](https://github.com/sinatra/sinatra/issues/1025), [#1052](https://github.com/sinatra/sinatra/issues/1052) (Many great folks)
94
116
 
95
117
  * Introduce `Sinatra::Ext` to workaround Rack 1.6 bug to fix Ruby 1.8.7
96
- support. #1080 (Zachary Scott)
118
+ support. [#1080](https://github.com/sinatra/sinatra/issues/1080) (Zachary Scott)
97
119
 
98
- * Add CONTRIBUTING guide. #987 (Katrina Owen)
120
+ * Add CONTRIBUTING guide. [#987](https://github.com/sinatra/sinatra/issues/987) (Katrina Owen)
99
121
 
100
122
 
101
123
  ## 1.4.6 / 2015-03-23
@@ -632,7 +654,7 @@ Backported from 1.3.0:
632
654
  same middleware chain. This caused issues if any non-sinatra routing
633
655
  happened in-between two of those instances, or running a request twice
634
656
  against an application (described in the README). The caching was reverted.
635
- See GH#239 and GH#256 for more infos. (Konstantin Haase)
657
+ See GH[#239](https://github.com/sinatra/sinatra/issues/239) and GH[#256](https://github.com/sinatra/sinatra/issues/256) for more infos. (Konstantin Haase)
636
658
 
637
659
  * Fixes issues where the top level DSL was interfering with method_missing
638
660
  proxies. This issue surfaced when Rails 3 was used with older Sass versions
@@ -1338,7 +1360,7 @@ the 1.0 release:
1338
1360
  * BUG: raising Sinatra::NotFound resulted in a 500 response
1339
1361
  code instead of 404.
1340
1362
 
1341
- * BUG: use_in_file_templates! fails with CR/LF (#45)
1363
+ * BUG: use_in_file_templates! fails with CR/LF [#45]
1342
1364
 
1343
1365
  * BUG: Sinatra detects the app file and root path when run under
1344
1366
  thin/passenger.
data/Gemfile CHANGED
@@ -34,6 +34,7 @@ if RUBY_ENGINE == "ruby"
34
34
  gem 'bluecloth'
35
35
  gem 'rdiscount'
36
36
  gem 'RedCloth'
37
+ gem "activesupport", "~> 5.1.6"
37
38
  gem 'puma'
38
39
  gem 'yajl-ruby'
39
40
  gem 'nokogiri'
@@ -728,7 +728,7 @@ Nimmt ebenso einen Block für Inline-Templates entgegen (siehe Beispiel).
728
728
  <table>
729
729
  <tr>
730
730
  <td>Abhängigkeit</td>
731
- <td><a href="http://liquidmarkup.org/">liquid</a></td>
731
+ <td><a href="https://shopify.github.io/liquid/">liquid</a></td>
732
732
  </tr>
733
733
  <tr>
734
734
  <td>Dateierweiterung</td>
@@ -752,7 +752,7 @@ denen man Variablen weitergibt.
752
752
  <td>Eine der folgenden Bibliotheken:
753
753
  <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
754
754
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
755
- <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
755
+ <a href="https://github.com/ged/bluecloth" title="bluecloth">BlueCloth</a>,
756
756
  <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a> oder
757
757
  <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
758
758
  </td>
@@ -732,7 +732,7 @@ También toma un bloque para plantillas inline (ver [ejemplo](#plantillas-inline
732
732
  <table>
733
733
  <tr>
734
734
  <td>Dependencias</td>
735
- <td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
735
+ <td><a href="https://shopify.github.io/liquid/" title="liquid">liquid</a></td>
736
736
  </tr>
737
737
  <tr>
738
738
  <td>Extensiones de Archivo</td>
@@ -755,7 +755,7 @@ plantilla Liquid, casi siempre va a querer pasarle locales.
755
755
  <td>
756
756
  <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
757
757
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
758
- <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
758
+ <a href="https://github.com/ged/bluecloth" title="bluecloth">BlueCloth</a>,
759
759
  <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a> o
760
760
  <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
761
761
  </td>
@@ -691,7 +691,7 @@ exemple).
691
691
  <table>
692
692
  <tr>
693
693
  <td>Dépendances</td>
694
- <td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
694
+ <td><a href="https://shopify.github.io/liquid/" title="liquid">liquid</a></td>
695
695
  </tr>
696
696
  <tr>
697
697
  <td>Extensions de fichier</td>
@@ -716,7 +716,7 @@ locales.
716
716
  Au choix :
717
717
  <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
718
718
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
719
- <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
719
+ <a href="https://github.com/ged/bluecloth" title="bluecloth">BlueCloth</a>,
720
720
  <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
721
721
  <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
722
722
  </td>
@@ -610,7 +610,7 @@ get('/') { markdown :index }
610
610
  <table>
611
611
  <tr>
612
612
  <td>依存</td>
613
- <td><a href="http://sass-lang.com/" title="sass">sass</a></td>
613
+ <td><a href="https://sass-lang.com/" title="sass">sass</a></td>
614
614
  </tr>
615
615
  <tr>
616
616
  <td>ファイル拡張子</td>
@@ -627,7 +627,7 @@ get('/') { markdown :index }
627
627
  <table>
628
628
  <tr>
629
629
  <td>依存</td>
630
- <td><a href="http://sass-lang.com/" title="sass">sass</a></td>
630
+ <td><a href="https://sass-lang.com/" title="sass">sass</a></td>
631
631
  </tr>
632
632
  <tr>
633
633
  <td>ファイル拡張子</td>
@@ -661,7 +661,7 @@ get('/') { markdown :index }
661
661
  <table>
662
662
  <tr>
663
663
  <td>依存</td>
664
- <td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
664
+ <td><a href="https://shopify.github.io/liquid/" title="liquid">liquid</a></td>
665
665
  </tr>
666
666
  <tr>
667
667
  <td>ファイル拡張子</td>
@@ -684,8 +684,8 @@ LiquidテンプレートからRubyのメソッド(`yield`を除く)を呼び出
684
684
  次の何れか:
685
685
  <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
686
686
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
687
- <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
688
- <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
687
+ <a href="https://github.com/ged/bluecloth" title="bluecloth">BlueCloth</a>,
688
+ <a href="https://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
689
689
  <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
690
690
  </td>
691
691
  </tr>
@@ -786,7 +786,7 @@ RDocからはRubyを呼ぶことができないので、RDocで書かれたレ
786
786
  <table>
787
787
  <tr>
788
788
  <td>依存</td>
789
- <td><a href="http://asciidoctor.org/" title="Asciidoctor">Asciidoctor</a></td>
789
+ <td><a href="https://asciidoctor.org/" title="Asciidoctor">Asciidoctor</a></td>
790
790
  </tr>
791
791
  <tr>
792
792
  <td>ファイル拡張子</td>
@@ -824,7 +824,7 @@ RadiusテンプレートからRubyのメソッドを直接呼び出すことが
824
824
  <table>
825
825
  <tr>
826
826
  <td>依存</td>
827
- <td><a href="http://markaby.github.io/" title="Markaby">Markaby</a></td>
827
+ <td><a href="https://markaby.github.io/" title="Markaby">Markaby</a></td>
828
828
  </tr>
829
829
  <tr>
830
830
  <td>ファイル拡張子</td>
@@ -1456,7 +1456,7 @@ get '/foo' do
1456
1456
  status 418
1457
1457
  headers \
1458
1458
  "Allow" => "BREW, POST, GET, PROPFIND, WHEN",
1459
- "Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
1459
+ "Refresh" => "Refresh: 20; https://www.ietf.org/rfc/rfc2324.txt"
1460
1460
  body "I'm a tea pot!"
1461
1461
  end
1462
1462
  ```
@@ -1586,7 +1586,7 @@ end
1586
1586
 
1587
1587
  ```ruby
1588
1588
  redirect to('/bar'), 303
1589
- redirect 'http://www.google.com/', 'wrong place, buddy'
1589
+ redirect 'https://www.google.com/', 'wrong place, buddy'
1590
1590
  ```
1591
1591
 
1592
1592
  また、`redirect back`を使えば、簡単にユーザが来たページへ戻るリダイレクトを作れます。
@@ -2219,7 +2219,7 @@ Sinatraを開発環境の下で実行している場合は、特別な`not_found
2219
2219
 
2220
2220
  ## Rackミドルウェア(Rack Middleware)
2221
2221
 
2222
- SinatraはRuby製Webフレームワークのミニマルな標準的インタフェースである[Rack](http://rack.github.io/)上に構築されています。アプリケーションデベロッパーにとってRackにおける最も興味深い機能は、「ミドルウェア(middleware)」をサポートしていることであり、これは、サーバとアプリケーションとの間に置かれ、HTTPリクエスト/レスポンスを監視および/または操作することで、各種の汎用的機能を提供するコンポーネントです。
2222
+ SinatraはRuby製Webフレームワークのミニマルな標準的インタフェースである[Rack](https://rack.github.io/)上に構築されています。アプリケーションデベロッパーにとってRackにおける最も興味深い機能は、「ミドルウェア(middleware)」をサポートしていることであり、これは、サーバとアプリケーションとの間に置かれ、HTTPリクエスト/レスポンスを監視および/または操作することで、各種の汎用的機能を提供するコンポーネントです。
2223
2223
 
2224
2224
  Sinatraはトップレベルの`use`メソッドを通して、Rackミドルウェアパイプラインの構築を楽にします。
2225
2225
 
@@ -2636,7 +2636,8 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
2636
2636
 
2637
2637
  ### マルチスレッド
2638
2638
 
2639
- _この[StackOverflow][so-answer]でのKonstantinによる回答を言い換えています。_
2639
+ _この[StackOverflow](https://stackoverflow.com/a/6282999/5245129)
2640
+ のKonstantinによる回答を言い換えています。_
2640
2641
 
2641
2642
  Sinatraでは同時実行モデルを負わせることはできませんが、根本的な部分であるThinやPuma、WebrickのようなRackハンドラ(サーバー)部分に委ねることができます。
2642
2643
  Sinatra自身はスレッドセーフであり、もしRackハンドラが同時実行モデルのスレッドを使用していても問題はありません。
@@ -2663,8 +2664,6 @@ App.run!
2663
2664
  thin --threaded start
2664
2665
  ```
2665
2666
 
2666
- [so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
2667
-
2668
2667
  ## 必要環境
2669
2668
 
2670
2669
  次のRubyバージョンが公式にサポートされています。
@@ -2734,7 +2733,7 @@ gem install sinatra --pre
2734
2733
 
2735
2734
  ### Bundlerを使う場合
2736
2735
 
2737
- 最新のSinatraでアプリケーションを動作させたい場合には、[Bundler](http://bundler.io)を使うのがお薦めのやり方です。
2736
+ 最新のSinatraでアプリケーションを動作させたい場合には、[Bundler](https://bundler.io)を使うのがお薦めのやり方です。
2738
2737
 
2739
2738
  まず、Bundlerがなければそれをインストールします。
2740
2739
 
@@ -2797,7 +2796,7 @@ sudo rake install
2797
2796
 
2798
2797
  ## バージョニング(Versioning)
2799
2798
 
2800
- Sinatraは、[Semantic Versioning](http://semver.org/)におけるSemVerおよびSemVerTagの両方に準拠しています。
2799
+ Sinatraは、[Semantic Versioning](https://semver.org/)におけるSemVerおよびSemVerTagの両方に準拠しています。
2801
2800
 
2802
2801
  ## 参考文献
2803
2802
 
@@ -2805,7 +2804,7 @@ Sinatraは、[Semantic Versioning](http://semver.org/)におけるSemVerおよ
2805
2804
  * [プロジェクトに参加(貢献)する](http://www.sinatrarb.com/contributing.html) - バグレポート パッチの送信、サポートなど
2806
2805
  * [Issue tracker](https://github.com/sinatra/sinatra/issues)
2807
2806
  * [Twitter](https://twitter.com/sinatra)
2808
- * [メーリングリスト](http://groups.google.com/group/sinatrarb/topics)
2807
+ * [メーリングリスト](https://groups.google.com/group/sinatrarb/topics)
2809
2808
  * http://freenode.net上のIRC: [#sinatra](irc://chat.freenode.net/#sinatra)
2810
2809
  * [Sinatra Book](https://github.com/sinatra/sinatra-book/) クックブック、チュートリアル
2811
2810
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) コミュニティによるレシピ集
@@ -653,7 +653,7 @@ get('/') { markdown :index }
653
653
  <table>
654
654
  <tr>
655
655
  <td>의존성</td>
656
- <td><a href="http://liquidmarkup.org/">liquid</a></td>
656
+ <td><a href="https://shopify.github.io/liquid/">liquid</a></td>
657
657
  </tr>
658
658
  <tr>
659
659
  <td>파일 확장자</td>
@@ -676,7 +676,7 @@ Liquid 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없
676
676
  <td>
677
677
  <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
678
678
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
679
- <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
679
+ <a href="https://github.com/ged/bluecloth" title="bluecloth">BlueCloth</a>,
680
680
  <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
681
681
  <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
682
682
  중 아무거나
data/README.md CHANGED
@@ -719,7 +719,7 @@ It also takes a block for inline templates (see [example](#inline-templates)).
719
719
  <table>
720
720
  <tr>
721
721
  <td>Dependency</td>
722
- <td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
722
+ <td><a href="https://shopify.github.io/liquid/" title="liquid">liquid</a></td>
723
723
  </tr>
724
724
  <tr>
725
725
  <td>File Extension</td>
@@ -655,7 +655,7 @@ It also takes a block for inline templates (see exemplo).
655
655
  <table>
656
656
  <tr>
657
657
  <td>Dependencia</td>
658
- <td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
658
+ <td><a href="https://shopify.github.io/liquid/" title="liquid">liquid</a></td>
659
659
  </tr>
660
660
  <tr>
661
661
  <td>Extencao do Arquivo</td>
@@ -679,7 +679,7 @@ você quase sempre precisará passar o `locals` para ele.
679
679
  Anyone of:
680
680
  <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
681
681
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
682
- <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
682
+ <a href="https://github.com/ged/bluecloth" title="bluecloth">BlueCloth</a>,
683
683
  <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
684
684
  <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
685
685
  </td>
@@ -1,6 +1,6 @@
1
1
  # Sinatra
2
2
 
3
- [![Build Status](https://secure.travis-ci.org/sinatra/sinatra.svg)](http://travis-ci.org/sinatra/sinatra)
3
+ [![Build Status](https://secure.travis-ci.org/sinatra/sinatra.svg)](https://travis-ci.org/sinatra/sinatra)
4
4
 
5
5
  *Внимание: Этот документ является переводом английской версии и может быть
6
6
  устаревшим*
@@ -24,7 +24,7 @@ end
24
24
  gem install sinatra
25
25
  ```
26
26
 
27
- и запустите приложение с помощью:
27
+ и запустите приложение при помощи:
28
28
 
29
29
  ```shell
30
30
  ruby myapp.rb
@@ -32,9 +32,12 @@ ruby myapp.rb
32
32
 
33
33
  Оцените результат: [http://localhost:4567](http://localhost:4567)
34
34
 
35
- Рекомендуется также установить Thin, сделать это можно командой: `gem install
36
- thin`. Thin это более производительный и функциональный сервер для
37
- разработки приложений на Sinatra.
35
+ Имейте ввиду, что изменения в коде не будут видны до тех пор, пока вы не перезапустите
36
+ сервер. Пожалуйста, перезагружайте сервер каждый раз как вносите изменения или добавьте
37
+ в проект [sinatra/reloader](http://www.sinatrarb.com/contrib/reloader).
38
+
39
+ Рекомендуется также установить Thin сервер (`gem install thin`), который автоматически
40
+ работает с Sinatra приложениями.
38
41
 
39
42
  ## Содержание
40
43
 
@@ -71,7 +74,7 @@ thin`. Thin — это более производительный и функц
71
74
  * [Yajl шаблоны](#yajl-шаблоны)
72
75
  * [WLang шаблоны](#wlang-шаблоны)
73
76
  * [Доступ к переменным в шаблонах](#Доступ-к-переменным-в-шаблонах)
74
- * [Шаблоны с `yield` и вложенные раскладки (layout)](#Шаблоны-с-yield-и-вложенные-раскладки-layout)
77
+ * [Шаблоны с `yield` и вложенные лэйауты](#Шаблоны-с-yield-и-вложенные-лэйауты)
75
78
  * [Включённые шаблоны](#Включённые-шаблоны)
76
79
  * [Именованные шаблоны](#Именованные-шаблоны)
77
80
  * [Привязка файловых расширений](#Привязка-файловых-расширений)
@@ -80,14 +83,14 @@ thin`. Thin — это более производительный и функц
80
83
  * [Фильтры](#Фильтры)
81
84
  * [Методы-помощники](#Методы-помощники)
82
85
  * [Использование сессий](#Использование-сессий)
83
- * [Секретная безопасность сессии](#Секретная-безопасность-сессии)
86
+ * [Безопасность сессии](#Безопасность-сессии)
84
87
  * [Конфигурация сессии](#Конфигурация-сессии)
85
- * [Выбор вашей собственной "прослойки" сессии](#Выбор-вашей-собственной-прослойки-сессий)
88
+ * [Выбор вашей собственной "прослойки" сессии](#Выбор-вашей-собственной-прослойки-сессии)
86
89
  * [Прерывание](#Прерывание)
87
90
  * [Передача](#Передача)
88
91
  * [Вызов другого маршрута](#Вызов-другого-маршрута)
89
- * [Задание тела, статус кода и заголовков ответа](#Задание-тела-статуса-кода-и-заголовков-ответа)
90
- * [Стриминг ответов](#Стриминг-ответов)
92
+ * [Установка тела, статус кода и заголовков ответа](#Установка-тела-статус-кода-и-заголовков-ответа)
93
+ * [Потоковые ответы](#Потоковые-ответы)
91
94
  * [Логирование](#Логирование)
92
95
  * [Mime-типы](#mime-типы)
93
96
  * [Генерирование URL](#Генерирование-url)
@@ -97,7 +100,7 @@ thin`. Thin — это более производительный и функц
97
100
  * [Доступ к объекту запроса](#Доступ-к-объекту-запроса)
98
101
  * [Вложения](#Вложения)
99
102
  * [Работа со временем и датами](#Работа-со-временем-и-датами)
100
- * [Поиск шаблонов](#Поиск-шаблонов)
103
+ * [Поиск файлов шаблонов](#Поиск-файлов-шаблонов)
101
104
  * [Конфигурация](#Конфигурация)
102
105
  * [Настройка защиты от атак](#Настройка-защиты-от-атак)
103
106
  * [Доступные настройки](#Доступные-настройки)
@@ -121,8 +124,8 @@ thin`. Thin — это более производительный и функц
121
124
  * [Командная строка](#Командная-строка)
122
125
  * [Многопоточность](#Многопоточность)
123
126
  * [Системные требования](#Системные-требования)
124
- * [На острие](#На-острие)
125
- * [С помощью Bundler](#С-помощью-bundler)
127
+ * [Самая свежая версия](#Самая-свежая-версия)
128
+ * [При помощи Bundler](#При-помощи-bundler)
126
129
  * [Версии](#Версии)
127
130
  * [Дальнейшее чтение](#Дальнейшее-чтение)
128
131
 
@@ -165,7 +168,7 @@ unlink '/' do
165
168
  end
166
169
  ```
167
170
 
168
- Маршруты сверяются с запросом в порядке очередности их записи в файле
171
+ Маршруты сверяются с запросом в порядке очерёдности их записи в файле
169
172
  приложения. Первый же совпавший с запросом маршрут и будет вызван.
170
173
 
171
174
  Маршруты с конечным слэшем отличаются от маршрутов без него:
@@ -198,8 +201,8 @@ get '/hello/:name' do |n|
198
201
  end
199
202
  ```
200
203
 
201
- Шаблоны маршрутов также могут включать в себя splat (или '*' маску,
202
- обозначающую любой символ) параметры, доступные в массиве `params['splat']`:
204
+ Шаблоны маршрутов также могут включать в себя splat параметры (или '*' маску,
205
+ обозначающую любой символ), доступные в массиве `params['splat']`:
203
206
 
204
207
  ```ruby
205
208
  get '/say/*/to/*' do
@@ -221,7 +224,7 @@ get '/download/*.*' do |path, ext|
221
224
  end
222
225
  ```
223
226
 
224
- Регулярные выражения в качестве шаблонов маршрутов:
227
+ Можно также использовать регулярные выражения в качестве шаблонов маршрутов:
225
228
 
226
229
  ```ruby
227
230
  get /\/hello\/([\w]+)/ do
@@ -257,9 +260,9 @@ get '/posts' do
257
260
  end
258
261
  ```
259
262
 
260
- Кстати, если вы не отключите защиту от обратного пути в директориях (path
261
- traversal, см. ниже), путь запроса может быть изменен до начала поиска
262
- подходящего маршрута.
263
+ **Имеейте ввиду**: если вы не отключите защиту от обратного пути в директориях
264
+ (_path traversal_, см. ниже), путь запроса может быть изменён до начала
265
+ поиска подходящего маршрута.
263
266
 
264
267
  Вы можете настроить Mustermann опции, используемые для данного маршрута, путём передачи в `:mustermann_opts` хэш:
265
268
 
@@ -275,8 +278,8 @@ end
275
278
 
276
279
  ### Условия
277
280
 
278
- Маршруты могут включать различные условия совпадений, например, клиентское
279
- приложение (user agent):
281
+ Маршруты могут включать в себя различные условия совпадений, такие как, например,
282
+ строка агента пользователя (user agent):
280
283
 
281
284
  ```ruby
282
285
  get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
@@ -303,9 +306,10 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
303
306
  builder :feed
304
307
  end
305
308
  ```
309
+
306
310
  `provides` ищет заголовок запроса `Accept`.
307
311
 
308
- Вы можете задать собственные условия:
312
+ Вы можете с лёгкостью задавать собственные условия:
309
313
 
310
314
  ```ruby
311
315
  set(:probability) { |value| condition { rand <= value } }
@@ -319,10 +323,10 @@ get '/win_a_car' do
319
323
  end
320
324
  ```
321
325
 
322
- Для условия, которое принимает несколько параметров, используйте звездочку:
326
+ Ипользуйте splat-оператор (`*`) для условий, которые принимают несколько аргументов:
323
327
 
324
328
  ```ruby
325
- set(:auth) do |*roles| # <- обратите внимание на звездочку
329
+ set(:auth) do |*roles| # <- обратите внимание на звёздочку
326
330
  condition do
327
331
  unless logged_in? && roles.any? {|role| current_user.in_role? role }
328
332
  redirect "/login/", 303
@@ -342,8 +346,8 @@ end
342
346
  ### Возвращаемые значения
343
347
 
344
348
  Возвращаемое значение блока маршрута ограничивается телом ответа, которое
345
- будет передано HTTP клиенту, или следующей "прослойкой" (middleware) в Rack
346
- стеке. Чаще всего это строка, как в примерах выше. Но также приемлемы и
349
+ будет передано HTTP клиенту, или, по крайней мере, следующей "прослойке" (middleware)
350
+ в Rack стеке. Чаще всего это строка как в примерах выше. Но также приемлемы и
347
351
  другие значения.
348
352
 
349
353
  Вы можете вернуть любой объект, который будет либо корректным Rack ответом,
@@ -357,8 +361,7 @@ end
357
361
  данных в этот блок;
358
362
  * Fixnum, представляющий код состояния HTTP.
359
363
 
360
-
361
- Таким образом, легко можно реализовать, например, поточный пример:
364
+ Таким образом легко можно реализовать, например, потоковую передачу:
362
365
 
363
366
  ```ruby
364
367
  class Stream
@@ -370,14 +373,14 @@ end
370
373
  get('/') { Stream.new }
371
374
  ```
372
375
 
373
- Вы также можете использовать метод `stream` (описываемый ниже), чтобы
374
- уменьшить количество шаблонного кода и встраивать поточную логику прямо в
375
- маршрут.
376
+ Вы также можете использовать вспомогательный метод `stream` (описанный ниже)
377
+ для того, чтобы уменьшить количество шаблонного кода и встроить потоковую
378
+ логику прямо в маршрут.
376
379
 
377
380
  ### Собственные детекторы совпадений для маршрутов
378
381
 
379
382
  Как показано выше, Sinatra поставляется со встроенной поддержкой строк и
380
- регулярных выражений в качестве шаблонов URL. Но и это еще не все. Вы можете
383
+ регулярных выражений в качестве шаблонов URL. Но и это ещё не всё. Вы можете
381
384
  легко определить свои собственные детекторы совпадений (matchers) для
382
385
  маршрутов:
383
386
 
@@ -404,8 +407,8 @@ get all_but("/index") do
404
407
  end
405
408
  ```
406
409
 
407
- Заметьте, что предыдущий пример, возможно, чересчур усложнен, потому что он
408
- может быть реализован так:
410
+ Обратите внимание на то, что предыдущий пример, возможно, чересчур усложнён, потому что он
411
+ может быть реализован следующим образом:
409
412
 
410
413
  ```ruby
411
414
  get // do
@@ -414,7 +417,7 @@ get // do
414
417
  end
415
418
  ```
416
419
 
417
- Или с использованием негативного просмотра вперед:
420
+ Или с использованием негативной опережающей проверки (отрицательное look-ahead условие):
418
421
 
419
422
  ```ruby
420
423
  get %r{(?!/index)} do
@@ -424,8 +427,8 @@ end
424
427
 
425
428
  ## Статические файлы
426
429
 
427
- Статические файлы отдаются из `./public` директории. Вы можете указать другое
428
- место, используя опцию `:public_folder`:
430
+ Статические файлы раздаются из `./public` директории. Вы можете указать другое
431
+ месторасположение при помощи опции `:public_folder`:
429
432
 
430
433
  ```ruby
431
434
  set :public_folder, File.dirname(__FILE__) + '/static'
@@ -435,8 +438,8 @@ set :public_folder, File.dirname(__FILE__) + '/static'
435
438
  Например, файл `./public/css/style.css` будет доступен как
436
439
  `http://example.com/css/style.css`.
437
440
 
438
- Используйте опцию `:static_cache_control` (см. ниже), чтобы добавить заголовок
439
- `Cache-Control`.
441
+ Используйте опцию `:static_cache_control` (см. ниже) для того, чтобы добавить
442
+ заголовок `Cache-Control`.
440
443
 
441
444
  ## Представления / Шаблоны
442
445
 
@@ -449,7 +452,7 @@ get '/' do
449
452
  end
450
453
  ```
451
454
 
452
- Отобразит `views/index.erb`.
455
+ Данный код отрендерит файл `views/index.erb`.
453
456
 
454
457
  Вместо имени шаблона вы так же можете передавать непосредственно само
455
458
  содержимое шаблона:
@@ -461,7 +464,7 @@ get '/' do
461
464
  end
462
465
  ```
463
466
 
464
- Эти методы принимают второй аргумент, хеш с опциями:
467
+ Метод рендеринга шаблона принимает в качестве второго аргумента хэш с опциями:
465
468
 
466
469
  ```ruby
467
470
  get '/' do
@@ -469,10 +472,10 @@ get '/' do
469
472
  end
470
473
  ```
471
474
 
472
- Отобразит `views/index.erb`, вложенным в `views/post.erb` (по умолчанию:
473
- `views/layout.erb`, если существует).
475
+ Данный метод отрендерит шаблон `views/index.erb`, который будет вложен в `views/post.erb`
476
+ (по умолчанию: `views/layout.erb`, если файл существует).
474
477
 
475
- Любые опции, не понимаемые Sinatra, будут переданы в шаблонизатор:
478
+ Любые опции, которые Sinatra не распознает, будут переданы в шаблонизатор:
476
479
 
477
480
  ```ruby
478
481
  get '/' do
@@ -480,7 +483,7 @@ get '/' do
480
483
  end
481
484
  ```
482
485
 
483
- Вы также можете задавать опции для шаблонизаторов в общем:
486
+ Вы также можете глобально задавать опции для шаблонизаторов:
484
487
 
485
488
  ```ruby
486
489
  set :haml, :format => :html5
@@ -490,7 +493,7 @@ get '/' do
490
493
  end
491
494
  ```
492
495
 
493
- Опции, переданные в метод, переопределяют опции, заданные с помощью `set`.
496
+ Опции, переданные в метод, переопределяют опции, заданные при помощи `set`.
494
497
 
495
498
  Доступные опции:
496
499
 
@@ -498,13 +501,13 @@ end
498
501
  <dt>locals</dt>
499
502
  <dd>
500
503
  Список локальных переменных, передаваемых в документ.
501
- Например: <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>
504
+ Пример: <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>
502
505
  </dd>
503
506
 
504
507
  <dt>default_encoding</dt>
505
508
  <dd>
506
- Кодировка, которую следует использовать, если не удалось определить
507
- оригинальную. По умолчанию: <tt>settings.default_encoding</tt>.
509
+ Кодировка, которую следует использовать в том случае, если не удалось
510
+ определить оригинальную. По умолчанию: <tt>settings.default_encoding</tt>.
508
511
  </dd>
509
512
 
510
513
  <dt>views</dt>
@@ -514,14 +517,15 @@ end
514
517
 
515
518
  <dt>layout</dt>
516
519
  <dd>
517
- Использовать или нет лэйаут (<tt>true</tt> или <tt>false</tt>). Если же значение Symbol,
518
- то указывает, какой шаблон использовать в качестве лэйаута. Например:
519
- <tt>erb :index, :layout => !request.xhr?</tt>
520
+ Определяет необходимость использования лэйаута (<tt>true</tt> или <tt>false</tt>).
521
+ Если же в качестве значения передан символ, то его значение будет интерпретировано
522
+ как наименования файла шаблона лэйаута.
523
+ Пример: <tt>erb :index, :layout => !request.xhr?</tt>
520
524
  </dd>
521
525
 
522
526
  <dt>content_type</dt>
523
527
  <dd>
524
- Content-Type отображенного шаблона. По умолчанию: задается шаблонизатором.
528
+ Content-Type отображенного шаблона. По умолчанию: задаётся шаблонизатором.
525
529
  </dd>
526
530
 
527
531
  <dt>scope</dt>
@@ -534,29 +538,30 @@ end
534
538
  <dt>layout_engine</dt>
535
539
  <dd>
536
540
  Шаблонизатор, который следует использовать для отображения лэйаута.
537
- Полезная опция для шаблонизаторов, в которых нет никакой поддержки
541
+ Полезная опция для шаблонизаторов, в которых отсутствует поддержка
538
542
  лэйаутов. По умолчанию: тот же шаблонизатор, что используется и для самого
539
543
  шаблона. Пример: <tt>set :rdoc, :layout_engine => :erb</tt>
540
544
  </dd>
541
545
 
542
546
  <dt>layout_options</dt>
543
547
  <dd>
544
- Специальные опции, используемые только для рендеринга лэйаута. Например:
548
+ Специальные опции, используемые только для рендеринга лэйаута. Пример:
545
549
  <tt>set :rdoc, :layout_options => { :views => 'views/layouts' }</tt>
546
550
  </dd>
547
551
  </dl>
548
552
 
549
- По умолчанию считается, что шаблоны находятся в директории `./views`. Чтобы
550
- использовать другую директорию с шаблонами:
553
+ По умолчанию в качестве пути для хранения шаблонов принята директория `./views`.
554
+ Чтобы назначить другую директорию с шаблонами необходимо изменить настройки:
551
555
 
552
556
  ```ruby
553
557
  set :views, settings.root + '/templates'
554
558
  ```
555
559
 
556
- Важное замечание: вы всегда должны ссылаться на шаблоны с помощью символов
557
- (Symbol), даже когда они в поддиректории (в этом случае используйте
558
- `:'subdir/template'`). Вы должны использовать символы, потому что иначе
559
- шаблонизаторы попросту отображают любые строки, переданные им.
560
+ Важное замечание: вы всегда должны ссылаться на шаблоны при помощи символов
561
+ (Symbol), даже тогда, когда они расположены в поддиректории (в этом случае
562
+ используйте конструкции вида `:'subdir/template'`). Вы должны использовать
563
+ символы в связи с тем, что в ином случае шаблонизаторы попросту отображают
564
+ любые строки, переданные им.
560
565
 
561
566
  ### Буквальные шаблоны
562
567
 
@@ -566,9 +571,10 @@ get '/' do
566
571
  end
567
572
  ```
568
573
 
569
- Отобразит шаблон, переданный строкой. Опционально, можно задать `:path` и
570
- `:line` для более понятного бэктрейса, в случае, если существует путь к
571
- файловой системе и линия, которые ассоциируются с этой строкой:
574
+ Отобразит шаблон, содержимое которого передано строкой. Опционально можно
575
+ указать дополнительные опции `:path` и `:line` для того, чтобы улучшить бэктрейс.
576
+ Делайте это в том случае, если строка определена в некотором файле, к которому
577
+ можно указать путь и номер строки, где расположена исходная строка:
572
578
 
573
579
  ```ruby
574
580
  get '/' do
@@ -578,8 +584,9 @@ end
578
584
 
579
585
  ### Доступные шаблонизаторы
580
586
 
581
- Некоторые языки шаблонов имеют несколько реализаций. Чтобы указать, какую
582
- реализацию использовать, вам следует просто подключить нужную библиотеку:
587
+ Некоторые языки шаблонов имеют несколько реализаций. Для того, чтобы указать
588
+ конкретную реализацию, которую вы хотите использовать, вам следует просто
589
+ подключить нужную библиотеку:
583
590
 
584
591
  ```ruby
585
592
  require 'rdiscount' # или require 'bluecloth'
@@ -610,7 +617,7 @@ get('/') { markdown :index }
610
617
  <td>Зависимости</td>
611
618
  <td>
612
619
  <a href="http://www.kuwata-lab.com/erubis/" title="erubis">erubis</a>
613
- или erb (включен в Ruby)
620
+ или erb (включён в Ruby)
614
621
  </td>
615
622
  </tr>
616
623
  <tr>
@@ -642,7 +649,7 @@ get('/') { markdown :index }
642
649
  </tr>
643
650
  </table>
644
651
 
645
- Блок также используется и для встроенных шаблонов (см. пример).
652
+ Шаблонизатор также принимает блоки для включённых шаблонов ([см. пример](#Включённые-шаблоны)).
646
653
 
647
654
  #### Nokogiri шаблоны
648
655
 
@@ -661,14 +668,14 @@ get('/') { markdown :index }
661
668
  </tr>
662
669
  </table>
663
670
 
664
- Блок также используется и для встроенных шаблонов (см. пример).
671
+ Шаблонизатор также принимает блоки для включённых шаблонов ([см. пример](#Включённые-шаблоны)).
665
672
 
666
673
  #### Sass шаблоны
667
674
 
668
675
  <table>
669
676
  <tr>
670
677
  <td>Зависимости</td>
671
- <td><a href="http://sass-lang.com/" title="sass">sass</a></td>
678
+ <td><a href="https://sass-lang.com/" title="sass">sass</a></td>
672
679
  </tr>
673
680
  <tr>
674
681
  <td>Расширения файлов</td>
@@ -685,7 +692,7 @@ get('/') { markdown :index }
685
692
  <table>
686
693
  <tr>
687
694
  <td>Зависимости</td>
688
- <td><a href="http://sass-lang.com/" title="sass">sass</a></td>
695
+ <td><a href="https://sass-lang.com/" title="sass">sass</a></td>
689
696
  </tr>
690
697
  <tr>
691
698
  <td>Расширения файлов</td>
@@ -719,7 +726,7 @@ get('/') { markdown :index }
719
726
  <table>
720
727
  <tr>
721
728
  <td>Зависимости</td>
722
- <td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
729
+ <td><a href="https://shopify.github.io/liquid/" title="liquid">liquid</a></td>
723
730
  </tr>
724
731
  <tr>
725
732
  <td>Расширения файлов</td>
@@ -731,8 +738,9 @@ get('/') { markdown :index }
731
738
  </tr>
732
739
  </table>
733
740
 
734
- Так как в Liquid шаблонах невозможно вызывать методы из Ruby (кроме `yield`), то
735
- вы почти всегда будете передавать в шаблон локальные переменные.
741
+ В связи с тем, что в Liquid шаблонах невозможно вызывать методы из Ruby
742
+ (за исключением `yield`), вам почти всегда понадобиться передавать в шаблон
743
+ локальные переменные.
736
744
 
737
745
  #### Markdown шаблоны
738
746
 
@@ -743,8 +751,8 @@ get('/') { markdown :index }
743
751
  Любая из библиотек:
744
752
  <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
745
753
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
746
- <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
747
- <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
754
+ <a href="https://github.com/ged/bluecloth" title="bluecloth">BlueCloth</a>,
755
+ <a href="https://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
748
756
  <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
749
757
  </td>
750
758
  </tr>
@@ -759,23 +767,23 @@ get('/') { markdown :index }
759
767
  </table>
760
768
 
761
769
  В Markdown невозможно вызывать методы или передавать локальные переменные.
762
- Следовательно, вам, скорее всего, придется использовать этот шаблон совместно
770
+ По этой причине вам, скорее всего, придётся использовать этот шаблон совместно
763
771
  с другим шаблонизатором:
764
772
 
765
773
  ```ruby
766
774
  erb :overview, :locals => { :text => markdown(:introduction) }
767
775
  ```
768
776
 
769
- Заметьте, что вы можете вызывать метод `markdown` из других шаблонов:
777
+ Обратите внимание на то, что вы можете вызывать метод `markdown` из других шаблонов:
770
778
 
771
779
  ```ruby
772
780
  %h1 Hello From Haml!
773
781
  %p= markdown(:greetings)
774
782
  ```
775
783
 
776
- Вы не можете вызывать Ruby из Markdown, соответственно, вы не можете
777
- использовать лэйауты на Markdown. Тем не менее, есть возможность использовать
778
- один шаблонизатор для отображения шаблона, а другой для лэйаута с помощью
784
+ Вы не можете вызывать Ruby код код из Markdown, соответственно вы не можете
785
+ использовать лэйауты на Markdown. Тем не менее, существует возможность использовать
786
+ один шаблонизатор для отображения шаблона, а другой для лэйаута при помощи
779
787
  опции `:layout_engine`.
780
788
 
781
789
  #### Textile шаблоны
@@ -796,23 +804,23 @@ erb :overview, :locals => { :text => markdown(:introduction) }
796
804
  </table>
797
805
 
798
806
  В Textile невозможно вызывать методы или передавать локальные переменные.
799
- Следовательно, вам, скорее всего, придется использовать этот шаблон совместно
800
- с другим шаблонизатором:
807
+ Следовательно, вам, скорее всего, придётся использовать данный шаблон
808
+ совместно с другим шаблонизатором:
801
809
 
802
810
  ```ruby
803
811
  erb :overview, :locals => { :text => textile(:introduction) }
804
812
  ```
805
813
 
806
- Заметьте, что вы можете вызывать метод `textile` из других шаблонов:
814
+ Обратите внимание на то, что вы можете вызывать метод `textile` из других шаблонов:
807
815
 
808
816
  ```ruby
809
817
  %h1 Hello From Haml!
810
818
  %p= textile(:greetings)
811
819
  ```
812
820
 
813
- Вы не можете вызывать Ruby из Textile, соответственно, вы не можете
814
- использовать лэйауты на Textile. Тем не менее, есть возможность использовать
815
- один шаблонизатор для отображения шаблона, а другой для лэйаута с помощью
821
+ Вы не можете вызывать Ruby код код из Textile, соответственно вы не можете
822
+ использовать лэйауты на Textile. Тем не менее, существует возможность использовать
823
+ один шаблонизатор для отображения шаблона, а другой для лэйаута при помощи
816
824
  опции `:layout_engine`.
817
825
 
818
826
  #### RDoc шаблоны
@@ -833,23 +841,23 @@ erb :overview, :locals => { :text => textile(:introduction) }
833
841
  </table>
834
842
 
835
843
  В RDoc невозможно вызывать методы или передавать локальные переменные.
836
- Следовательно, вам, скорее всего, придется использовать этот шаблон совместно
844
+ Следовательно, вам, скорее всего, придётся использовать этот шаблон совместно
837
845
  с другим шаблонизатором:
838
846
 
839
847
  ```ruby
840
848
  erb :overview, :locals => { :text => rdoc(:introduction) }
841
849
  ```
842
850
 
843
- Заметьте, что вы можете вызывать метод `rdoc` из других шаблонов:
851
+ Обратите внимание на то, что вы можете вызывать метод `rdoc` из других шаблонов:
844
852
 
845
853
  ```ruby
846
854
  %h1 Hello From Haml!
847
855
  %p= rdoc(:greetings)
848
856
  ```
849
857
 
850
- Вы не можете вызывать Ruby из RDoc, соответственно, вы не можете использовать
851
- лэйауты на RDoc. Тем не менее, есть возможность использовать один шаблонизатор
852
- для отображения шаблона, а другой для лэйаута с помощью опции
858
+ Вы не можете вызывать Ruby код код из RDoc, соответственно вы не можете использовать
859
+ лэйауты на RDoc. Тем не менее, существует возможность использовать один шаблонизатор
860
+ для отображения шаблона, а другой для лэйаута при помощи опции
853
861
  `:layout_engine`.
854
862
 
855
863
  #### AsciiDoc шаблоны
@@ -897,7 +905,7 @@ erb :overview, :locals => { :text => rdoc(:introduction) }
897
905
  <table>
898
906
  <tr>
899
907
  <td>Зависимости</td>
900
- <td><a href="http://markaby.github.io/" title="Markaby">Markaby</a></td>
908
+ <td><a href="https://markaby.github.io/" title="Markaby">Markaby</a></td>
901
909
  </tr>
902
910
  <tr>
903
911
  <td>Расширения файлов</td>
@@ -909,7 +917,7 @@ erb :overview, :locals => { :text => rdoc(:introduction) }
909
917
  </tr>
910
918
  </table>
911
919
 
912
- Блок также используется и для встроенных шаблонов (см. пример).
920
+ Шаблонизатор также принимает блоки для включённых шаблонов ([см. пример](#Включённые-шаблоны)).
913
921
 
914
922
  #### RABL шаблоны
915
923
 
@@ -963,23 +971,23 @@ erb :overview, :locals => { :text => rdoc(:introduction) }
963
971
  </table>
964
972
 
965
973
  В Creole невозможно вызывать методы или передавать локальные переменные.
966
- Следовательно, вам, скорее всего, придется использовать этот шаблон совместно
974
+ Следовательно, вам, скорее всего, придётся использовать данный шаблон совместно
967
975
  с другим шаблонизатором:
968
976
 
969
977
  ```ruby
970
978
  erb :overview, :locals => { :text => creole(:introduction) }
971
979
  ```
972
980
 
973
- Заметьте, что вы можете вызывать метод `creole` из других шаблонов:
981
+ обратите внимание на то, что вы можете вызывать метод `creole` из других шаблонов:
974
982
 
975
983
  ```ruby
976
984
  %h1 Hello From Haml!
977
985
  %p= creole(:greetings)
978
986
  ```
979
987
 
980
- Вы не можете вызывать Ruby из Creole, соответственно, вы не можете
981
- использовать лэйауты на Creole. Тем не менее, есть возможность использовать
982
- один шаблонизатор для отображения шаблона, а другой для лэйаута с помощью
988
+ Вы не можете вызывать Ruby код из Creole, соответственно вы не можете
989
+ использовать лэйауты на Creole. Тем не менее, существует возможность использовать
990
+ один шаблонизатор для отображения шаблона, а другой для лэйаута при помощи
983
991
  опции `:layout_engine`.
984
992
 
985
993
  #### MediaWiki шаблоны
@@ -1000,23 +1008,23 @@ erb :overview, :locals => { :text => creole(:introduction) }
1000
1008
  </table>
1001
1009
 
1002
1010
  В разметке MediaWiki невозможно вызывать методы или передавать локальные переменные.
1003
- Следовательно, вам, скорее всего, придется использовать этот шаблон совместно
1011
+ Следовательно, вам, скорее всего, придётся использовать этот шаблон совместно
1004
1012
  с другим шаблонизатором:
1005
1013
 
1006
1014
  ```ruby
1007
1015
  erb :overview, :locals => { :text => mediawiki(:introduction) }
1008
1016
  ```
1009
1017
 
1010
- Заметьте, что вы можете вызывать метод `mediawiki` из других шаблонов:
1018
+ Обратите внимание на то, что вы можете вызывать метод `mediawiki` из других шаблонов:
1011
1019
 
1012
1020
  ```ruby
1013
1021
  %h1 Hello From Haml!
1014
1022
  %p= mediawiki(:greetings)
1015
1023
  ```
1016
1024
 
1017
- Вы не можете вызывать Ruby из MediaWiki, соответственно, вы не можете
1018
- использовать лэйауты на MediaWiki. Тем не менее, есть возможность использовать
1019
- один шаблонизатор для отображения шаблона, а другой для лэйаута с помощью
1025
+ Вы не можете вызывать Ruby код из MediaWiki, соответственно вы не можете
1026
+ использовать лэйауты на MediaWiki. Тем не менее, существует возможность использовать
1027
+ один шаблонизатор для отображения шаблона, а другой для лэйаута при помощи
1020
1028
  опции `:layout_engine`.
1021
1029
 
1022
1030
  #### CoffeeScript шаблоны
@@ -1028,7 +1036,7 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
1028
1036
  <a href="https://github.com/josh/ruby-coffee-script" title="Ruby CoffeeScript">
1029
1037
  CoffeeScript
1030
1038
  </a> и
1031
- <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
1039
+ <a href="https://github.com/sstephenson/execjs" title="ExecJS">
1032
1040
  способ запускать JavaScript
1033
1041
  </a>
1034
1042
  </td>
@@ -1052,7 +1060,7 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
1052
1060
  <a href="https://github.com/forgecrafted/ruby-stylus" title="Ruby Stylus">
1053
1061
  Stylus
1054
1062
  </a> и
1055
- <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
1063
+ <a href="https://github.com/sstephenson/execjs" title="ExecJS">
1056
1064
  способ запускать JavaScript
1057
1065
  </a>
1058
1066
  </td>
@@ -1067,8 +1075,8 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
1067
1075
  </tr>
1068
1076
  </table>
1069
1077
 
1070
- Перед тем, как использовать шаблоны стилус, загрузите `stylus` и
1071
- `stylus/tilt`:
1078
+ Перед тем, как использовать шаблоны Stylus, необходимо сперва подключить
1079
+ `stylus` и `stylus/tilt`:
1072
1080
 
1073
1081
  ```ruby
1074
1082
  require 'sinatra'
@@ -1105,7 +1113,7 @@ end
1105
1113
  </table>
1106
1114
 
1107
1115
  Содержимое шаблона интерпретируется как код на Ruby, а результирующая
1108
- переменная json затем конвертируется с помощью `#to_json`.
1116
+ переменная json затем конвертируется при помощи `#to_json`.
1109
1117
 
1110
1118
  ```ruby
1111
1119
  json = { :foo => 'bar' }
@@ -1113,10 +1121,11 @@ json[:baz] = key
1113
1121
  ```
1114
1122
 
1115
1123
  Опции `:callback` и `:variable` используются для "декорирования" итогового
1116
- объекта.
1124
+ объекта:
1117
1125
 
1118
1126
  ```ruby
1119
- var resource = {"foo":"bar","baz":"qux"}; present(resource);
1127
+ var resource = {"foo":"bar","baz":"qux"};
1128
+ present(resource);
1120
1129
  ```
1121
1130
 
1122
1131
  #### WLang шаблоны
@@ -1124,7 +1133,7 @@ var resource = {"foo":"bar","baz":"qux"}; present(resource);
1124
1133
  <table>
1125
1134
  <tr>
1126
1135
  <td>Зависимости</td>
1127
- <td><a href="https://github.com/blambeau/wlang/" title="wlang">wlang</a></td>
1136
+ <td><a href="https://github.com/blambeau/wlang" title="WLang">WLang</a></td>
1128
1137
  </tr>
1129
1138
  <tr>
1130
1139
  <td>Расширения файлов</td>
@@ -1138,7 +1147,7 @@ var resource = {"foo":"bar","baz":"qux"}; present(resource);
1138
1147
 
1139
1148
  Так как в WLang шаблонах невозможно вызывать методы из Ruby напрямую (за
1140
1149
  исключением `yield`), то вы почти всегда будете передавать в шаблон локальные
1141
- переменные.
1150
+ переменные. Лэйауты также могут быть описаны при помощи WLang.
1142
1151
 
1143
1152
  ### Доступ к переменным в шаблонах
1144
1153
 
@@ -1153,7 +1162,7 @@ get '/:id' do
1153
1162
  end
1154
1163
  ```
1155
1164
 
1156
- Либо установите их через хеш локальных переменных:
1165
+ Вы также можете установить их при помощи хэша локальных переменных:
1157
1166
 
1158
1167
  ```ruby
1159
1168
  get '/:id' do
@@ -1162,14 +1171,13 @@ get '/:id' do
1162
1171
  end
1163
1172
  ```
1164
1173
 
1165
- Это обычный подход, когда шаблоны рендерятся как части других шаблонов.
1174
+ Это обычный подход, применяемый тогда, когда шаблоны рендерятся как части других шаблонов.
1166
1175
 
1167
- ### Шаблоны с `yield` и вложенные раскладки (layout)
1176
+ ### Шаблоны с `yield` и вложенные лэйауты
1168
1177
 
1169
- Раскладка (layout) обычно представляет собой шаблон, который исполняет
1170
- `yield`.
1171
- Такой шаблон может быть либо использован с помощью опции `:template`,
1172
- как описано выше, либо он может быть дополнен блоком:
1178
+ Лэйаут (layout) обычно представляет собой шаблон, который исполняет
1179
+ `yield`. Такой шаблон может быть использован либо при помощи опции `:template`,
1180
+ как описано выше, либо при помощи блока:
1173
1181
 
1174
1182
  ```ruby
1175
1183
  erb :post, :layout => false do
@@ -1177,10 +1185,10 @@ erb :post, :layout => false do
1177
1185
  end
1178
1186
  ```
1179
1187
 
1180
- Эти инструкции в основном эквивалентны `erb :index, :layout => :post`.
1188
+ Эти инструкции по сути эквивалентны `erb :index, :layout => :post`.
1181
1189
 
1182
1190
  Передача блоков интерпретирующим шаблоны методам наиболее полезна для
1183
- создания вложенных раскладок:
1191
+ создания вложенных лэйаутов:
1184
1192
 
1185
1193
  ```ruby
1186
1194
  erb :main_layout, :layout => false do
@@ -1190,7 +1198,7 @@ erb :main_layout, :layout => false do
1190
1198
  end
1191
1199
  ```
1192
1200
 
1193
- Это же самое может быть сделано короче:
1201
+ То же самое может быть сделано в более короткой форме:
1194
1202
 
1195
1203
  ```ruby
1196
1204
  erb :admin_layout, :layout => :main_layout do
@@ -1198,10 +1206,9 @@ erb :admin_layout, :layout => :main_layout do
1198
1206
  end
1199
1207
  ```
1200
1208
 
1201
- В настоящее время, следующие интерпретирующие шаблоны методы
1202
- принимают блок:
1203
- `erb`, `haml`, `liquid`, `slim `, `wlang`.
1204
- Общий метод заполнения шаблонов `render` также принимает блок.
1209
+ В настоящее время следующие методы шаблонизаторов
1210
+ принимают блок: `erb`, `haml`, `liquid`, `slim `, `wlang`. Кроме того,
1211
+ общий метод построения шаблонов `render` также принимает блок.
1205
1212
 
1206
1213
  ### Включённые шаблоны
1207
1214
 
@@ -1224,13 +1231,13 @@ __END__
1224
1231
  %div.title Hello world.
1225
1232
  ```
1226
1233
 
1227
- Заметьте: включённые шаблоны, определенные в исходном файле, который подключил
1234
+ Обратите внимание: включённые шаблоны, определённые в исходном файле, который подключил
1228
1235
  Sinatra, будут загружены автоматически. Вызовите `enable :inline_templates`
1229
- напрямую, если используете включённые шаблоны в других файлах.
1236
+ напрямую в том случае, если используете включённые шаблоны в других файлах.
1230
1237
 
1231
1238
  ### Именованные шаблоны
1232
1239
 
1233
- Шаблоны также могут быть определены при помощи `template` метода:
1240
+ Шаблоны также могут быть определены при помощи метода `template`:
1234
1241
 
1235
1242
  ```ruby
1236
1243
  template :layout do
@@ -1247,8 +1254,8 @@ end
1247
1254
  ```
1248
1255
 
1249
1256
  Если шаблон с именем "layout" существует, то он будет использоваться каждый
1250
- раз при рендеринге. Вы можете отключать лэйаут в каждом конкретном случае с
1251
- помощью `:layout => false` или отключить его для всего приложения: `set :haml,
1257
+ раз при рендеринге. Вы можете отключать лэйаут в каждом конкретном случае при
1258
+ помощи опции `:layout => false` или отключить его для всего приложения: `set :haml,
1252
1259
  :layout => false`:
1253
1260
 
1254
1261
  ```ruby
@@ -1259,9 +1266,9 @@ end
1259
1266
 
1260
1267
  ### Привязка файловых расширений
1261
1268
 
1262
- Чтобы связать расширение файла с движком рендеринга, используйте
1263
- `Tilt.register`. Например, если вы хотите использовать расширение `tt` для
1264
- шаблонов Textile:
1269
+ Для того, чтобы связать расширение файла с движком рендеринга, используйте
1270
+ `Tilt.register`. Так, например, вызовите следующий код в том случае, если вы
1271
+ хотите использовать расширение `tt` для шаблонов Textile:
1265
1272
 
1266
1273
  ```ruby
1267
1274
  Tilt.register :tt, Tilt[:textile]
@@ -1269,7 +1276,7 @@ Tilt.register :tt, Tilt[:textile]
1269
1276
 
1270
1277
  ### Добавление собственного движка рендеринга
1271
1278
 
1272
- Сначала зарегистрируйте свой движок в Tilt, а затем создайте метод, отвечающий
1279
+ Сначала зарегистрируйте собственный движок в Tilt, а затем создайте метод, отвечающий
1273
1280
  за рендеринг:
1274
1281
 
1275
1282
  ```ruby
@@ -1284,13 +1291,13 @@ get '/' do
1284
1291
  end
1285
1292
  ```
1286
1293
 
1287
- Отобразит `./views/index.myat`. Чтобы узнать больше о Tilt, смотрите
1288
- https://github.com/rtomayko/tilt
1294
+ Данный код отрендерит `./views/index.myat`.
1295
+ Подробнее о [Tilt](https://github.com/rtomayko/tilt#readme).
1289
1296
 
1290
1297
  ### Использование пользовательской логики для поиска шаблона
1291
1298
 
1292
- Для того, чтобы реализовать свой собственный механизм поиска шаблона,
1293
- необходимо написать свой собственный `#find_template` метод:
1299
+ Для того, чтобы реализовать собственный механизм поиска шаблона,
1300
+ необходимо написать метод `#find_template`:
1294
1301
 
1295
1302
  ```ruby
1296
1303
  configure do
@@ -1333,12 +1340,12 @@ after do
1333
1340
  end
1334
1341
  ```
1335
1342
 
1336
- Заметьте: если вы используете метод `body`, а не просто возвращаете строку из
1343
+ Обратите внимание: если вы используете метод `body`, а не просто возвращаете строку из
1337
1344
  маршрута, то тело ответа не будет доступно в `after`-фильтрах, так как оно
1338
1345
  будет сгенерировано позднее.
1339
1346
 
1340
- Фильтры могут использовать шаблоны URL и будут интерпретированы, только если
1341
- путь запроса совпадет с этим шаблоном:
1347
+ Фильтры также могут использовать шаблоны URL и будут выполнены только в том случае,
1348
+ если путь запроса совпадет с указанным шаблоном:
1342
1349
 
1343
1350
  ```ruby
1344
1351
  before '/protected/*' do
@@ -1364,8 +1371,9 @@ end
1364
1371
 
1365
1372
  ## Методы-помощники
1366
1373
 
1367
- Используйте высокоуровневый метод `helpers`, чтобы определить
1368
- методы-помощники для использования в обработчиках маршрутов и шаблонах:
1374
+ Используйте высокоуровневый метод `helpers` для того, чтобы определить
1375
+ методы-помощники, которые могут быть использованы в обработчиках маршрутов
1376
+ и шаблонах:
1369
1377
 
1370
1378
  ```ruby
1371
1379
  helpers do
@@ -1397,8 +1405,8 @@ helpers FooUtils, BarUtils
1397
1405
 
1398
1406
  ### Использование сессий
1399
1407
 
1400
- Сессия используется, чтобы сохранять состояние между запросами. Если эта опция
1401
- включена, то у вас будет один хеш сессии на одну пользовательскую сессию:
1408
+ Сессия используется для того, чтобы сохранять состояние между запросами. Если
1409
+ эта опция включена, то у вас будет один хэш сессии на один пользовательский сеанс:
1402
1410
 
1403
1411
  ```ruby
1404
1412
  enable :sessions
@@ -1412,30 +1420,30 @@ get '/:value' do
1412
1420
  end
1413
1421
  ```
1414
1422
 
1415
- ### Секретная безопасность сессии
1423
+ ### Безопасность сессии
1416
1424
 
1417
- Чтобы повысить безопасность, данные сессии в файле 'cookie' подписываются
1418
- ключом сессии с использованием `HMAC-SHA1`. Этот ключ сессии должен быть
1419
- оптимальным криптографическим 'secure random' значением соответствующей
1425
+ Для того, чтобы повысить безопасность, данные сессии в файле 'cookie'
1426
+ подписываются ключом сессии с использованием `HMAC-SHA1`. Этот ключ сессии
1427
+ должен быть оптимальным криптографическим 'secure random' значением соответствующей
1420
1428
  длины, которая для `HMAC-SHA1` больше или равна 64 байтам (512 бит, 128
1421
1429
  шестнадцатеричных символов). Не рекомендуется использовать ключ, длина
1422
1430
  которого менее 32 байт (256 бит, 64 шестнадцатеричных символа). Поэтому
1423
1431
  **очень важно**, чтобы вы не просто составили значение ключа, а использовали
1424
- генератор 'secure random' чисел для его создания. Люди очень плохо генерируют
1425
- случайные значения.
1426
-
1427
- По умолчанию, Sinatra создаёт для вас 'secure random' ключ сессии из 32 байт,
1428
- но он будет меняться при каждом перезапуске приложения. Если у вас есть
1429
- несколько экземпляров вашего приложения, и вы позволяете чтобы Sinatra
1430
- генерировала ключ, то каждый экземпляр будет иметь отличный ключ сессии,
1431
- который, вероятно, не тот, который вы хотите.
1432
+ безопасный генератор случайных чисел для его создания. Люди очень плохо
1433
+ придумывают случайные значения.
1434
+
1435
+ По умолчанию, Sinatra создаёт для вас безопасный случайный ключ сессии из
1436
+ 32 байт, однако он будет меняться при каждом перезапуске приложения. Если у
1437
+ вас есть несколько экземпляров вашего приложения, и вы доверили Sinatra
1438
+ генерацию ключа, то каждый экземпляр будет иметь отличный ключ сессии,
1439
+ что, вероятно, не совсем то, что вам необходимо.
1432
1440
 
1433
1441
  Для лучшей безопасности и удобства использования
1434
- [рекомендуется](https://12factor.net/config) генерировать 'secure random'
1442
+ [рекомендуется](https://12factor.net/config) генерировать случайный безопасный
1435
1443
  ключ и хранить его в переменной среды на каждом хосте, на котором запущено
1436
1444
  приложение, чтобы все экземпляры вашего приложения использовали один и тот
1437
- же ключ. Вы должны периодически менять значение ключа сессии.
1438
- Вот несколько примеров того, как вы можете создать ключ на 64 байта
1445
+ же ключ. Вы должны периодически менять значение ключа сессии на новое.
1446
+ Вот несколько примеров того, как вы можете создать 64-байтный ключ
1439
1447
  и установить его:
1440
1448
 
1441
1449
  **Генерация ключа сессии**
@@ -1447,10 +1455,10 @@ $ ruby -e "require 'securerandom'; puts SecureRandom.hex(64)"
1447
1455
 
1448
1456
  **Генерация ключа сессии (бонусные пункты)**
1449
1457
 
1450
- Используйте [гем 'sysrandom'](https://github.com/cryptosphere/sysrandom)
1458
+ Используйте [гем 'sysrandom'](https://github.com/cryptosphere/sysrandom#readme).
1451
1459
  Предпочтительнее использовать системные средства RNG для генерации случайных
1452
- значений вместо пространства пользователя `OpenSSL`, для которого в данный
1453
- момент по умолчанию используется MRI Ruby:
1460
+ значений вместо пространства пользователя `OpenSSL`, который в настоящее время
1461
+ по умолчанию используется в MRI Ruby:
1454
1462
 
1455
1463
  ```text
1456
1464
  $ gem install sysrandom
@@ -1462,11 +1470,12 @@ $ ruby -e "require 'sysrandom/securerandom'; puts SecureRandom.hex(64)"
1462
1470
  99ae8af...snip...ec0f262ac
1463
1471
  ```
1464
1472
 
1465
- **Переменная среды `SESSION_SECRET`**
1473
+ **Переменная среды для ключа сессии**
1466
1474
 
1467
- Задайте переменной среды для Sinatra `SESSION_SECRET` значение, которое вы
1468
- сгенерировали. Сделайте это значение постоянным при перезагрузке вашего
1469
- хоста. Поскольку метод для генерации будет различным в разных системах,
1475
+ Задайте переменной среды `SESSION_SECRET` значение, которое вы
1476
+ сгенерировали. Данная переменная автоматически будет использована Sinatra.
1477
+ Сделайте это значение постоянным при перезагрузке вашего
1478
+ сервера. Поскольку метод для генерации будет различным в разных системах,
1470
1479
  то код ниже приведён только в качестве примера:
1471
1480
 
1472
1481
  ```bash
@@ -1475,11 +1484,12 @@ $ ruby -e "require 'sysrandom/securerandom'; puts SecureRandom.hex(64)"
1475
1484
 
1476
1485
  **Конфигурация приложения**
1477
1486
 
1478
- Настройте конфигурацию вашего приложения в безопасном режиме для
1479
- 'secure random' ключа если переменная среды `SESSION_SECRET` не доступна.
1487
+ В целях безопасности настройте конфигурацию вашего приложения таким образом,
1488
+ чтобы оно генерировало случайный безопасный ключ тогда, когда переменная
1489
+ среды `SESSION_SECRET` не доступна.
1480
1490
 
1481
1491
  В качестве бонусных пунктов здесь тоже используйте
1482
- [гем 'sysrandom'gem](https://github.com/cryptosphere/sysrandom) :
1492
+ [гем 'sysrandom'gem](https://github.com/cryptosphere/sysrandom):
1483
1493
 
1484
1494
  ```ruby
1485
1495
  require 'securerandom'
@@ -1489,7 +1499,7 @@ set :session_secret, ENV.fetch('SESSION_SECRET') { SecureRandom.hex(64) }
1489
1499
 
1490
1500
  #### Конфигурация сессии
1491
1501
 
1492
- Если вы хотите больше настроек для сессий, вы можете задать их, передав хеш
1502
+ Если вы хотите больше настроек для сессий, вы можете задать их, передав хэш
1493
1503
  опций в параметр `sessions`:
1494
1504
 
1495
1505
  ```ruby
@@ -1505,9 +1515,9 @@ set :sessions, :domain => '.foo.com'
1505
1515
 
1506
1516
  #### Выбор вашей собственной "прослойки" сессии
1507
1517
 
1508
- Заметьте, что при использовании `enable :sessions` все данные сохраняются в
1509
- куках (cookies). Это может быть не совсем то, что вы хотите (например,
1510
- сохранение больших объемов данных увеличит ваш трафик). В таком случае вы
1518
+ Обратите внимание на то, что при использовании `enable :sessions` все данные
1519
+ сохраняются в куках (cookies). Это может быть не совсем то, что вы хотите (например,
1520
+ сохранение больших объёмов данных увеличит ваш трафик). В таком случае вы
1511
1521
  можете использовать альтернативную Rack "прослойку" (middleware), реализующую
1512
1522
  механизм сессий. Для этого используете один из способов ниже:
1513
1523
 
@@ -1516,20 +1526,20 @@ enable :sessions
1516
1526
  set :session_store, Rack::Session::Pool
1517
1527
  ```
1518
1528
 
1519
- Или установите параметры сессии с помощью хеша опций:
1529
+ Или установите параметры сессии при помощи хэша опций:
1520
1530
 
1521
1531
  ```ruby
1522
1532
  set :sessions, :expire_after => 2592000
1523
1533
  set :session_store, Rack::Session::Pool
1524
1534
  ```
1525
1535
 
1526
- Вы так же можете не вызывать `enable :sessions`, а вместо этого вызывать
1527
- необходимую вам прослойку так же, как вы это обычно делаете.
1536
+ Вы также можете **не вызывать** `enable :sessions`, а вместо этого использовать
1537
+ необходимую вам Rack прослойку так же, как вы это обычно делаете.
1528
1538
 
1529
1539
  Очень важно обратить внимание на то, что когда вы используете этот метод,
1530
- основной способ защиты сессии **не будет включен по умолчанию**.
1540
+ основной способ защиты сессии **не будет включён по умолчанию**.
1531
1541
 
1532
- Если вы хотите включить защиту, вам нужно добавить следующие строчки:
1542
+ Вам также потребуется добавить следующие Rack middleware для этого:
1533
1543
 
1534
1544
  ```ruby
1535
1545
  use Rack::Session::Pool, :expire_after => 2592000
@@ -1537,12 +1547,12 @@ use Rack::Protection::RemoteToken
1537
1547
  use Rack::Protection::SessionHijacking
1538
1548
  ```
1539
1549
 
1540
- Смотрите секцию "Настройка защиты от атак" для более подробной информации.
1550
+ Смотрите раздел ["Настройка защиты от атак"](#Настройка-защиты-от-атак) для более подробной информации.
1541
1551
 
1542
1552
  ### Прерывание
1543
1553
 
1544
1554
  Чтобы незамедлительно прервать обработку запроса внутри фильтра или маршрута,
1545
- используйте:
1555
+ используйте следующую команду:
1546
1556
 
1547
1557
  ```ruby
1548
1558
  halt
@@ -1580,8 +1590,8 @@ halt erb(:error)
1580
1590
 
1581
1591
  ### Передача
1582
1592
 
1583
- Маршрут может передать обработку запроса следующему совпадающему маршруту,
1584
- используя `pass`:
1593
+ Маршрут может передать обработку запроса следующему совпадающему маршруту
1594
+ используя метод `pass`:
1585
1595
 
1586
1596
  ```ruby
1587
1597
  get '/guess/:who' do
@@ -1594,7 +1604,7 @@ get '/guess/*' do
1594
1604
  end
1595
1605
  ```
1596
1606
 
1597
- Блок маршрута сразу же прерывается, и контроль переходит к следующему
1607
+ Блок маршрута сразу же прерывается, а контроль переходит к следующему
1598
1608
  совпадающему маршруту. Если соответствующий маршрут не найден, то ответом на
1599
1609
  запрос будет 404.
1600
1610
 
@@ -1614,8 +1624,8 @@ get '/bar' do
1614
1624
  end
1615
1625
  ```
1616
1626
 
1617
- Заметьте, что в предыдущем примере можно облегчить тестирование и повысить
1618
- производительность, перенеся `"bar"` в метод-помощник, используемый и в
1627
+ Обратите внимание на то, что в предыдущем примере можно облегчить тестирование и
1628
+ повысить производительность, перенеся `"bar"` в метод-помощник, используемый и в
1619
1629
  `/foo`, и в `/bar`.
1620
1630
 
1621
1631
  Если вы хотите, чтобы запрос был отправлен в тот же экземпляр приложения,
@@ -1623,14 +1633,14 @@ end
1623
1633
 
1624
1634
  Если хотите узнать больше о `call`, смотрите спецификацию Rack.
1625
1635
 
1626
- ### Задание тела, кода и заголовков ответа
1636
+ ### Установка тела, статус кода и заголовков ответа
1627
1637
 
1628
1638
  Хорошим тоном является установка кода состояния HTTP и тела ответа в
1629
1639
  возвращаемом значении обработчика маршрута. Тем не менее, в некоторых
1630
1640
  ситуациях вам, возможно, понадобится задать тело ответа в произвольной точке
1631
- потока исполнения. Вы можете сделать это с помощью метода-помощника `body`.
1641
+ потока исполнения. Вы можете сделать это при помощи метода-помощника `body`.
1632
1642
  Если вы задействуете метод `body`, то вы можете использовать его и в
1633
- дальнейшем, чтобы получить доступ к телу ответа.
1643
+ дальнейшем, чтобы получить доступ к телу ответа:
1634
1644
 
1635
1645
  ```ruby
1636
1646
  get '/foo' do
@@ -1644,7 +1654,7 @@ end
1644
1654
 
1645
1655
  Также можно передать блок в метод `body`, который затем будет вызван
1646
1656
  обработчиком Rack (такой подход может быть использован для реализации
1647
- поточного ответа, см. "Возвращаемые значения").
1657
+ потокового ответа, см. ["Возвращаемые значения"](#Возвращаемые-значения)).
1648
1658
 
1649
1659
  Аналогично вы можете установить код ответа и его заголовки:
1650
1660
 
@@ -1653,7 +1663,7 @@ get '/foo' do
1653
1663
  status 418
1654
1664
  headers \
1655
1665
  "Allow" => "BREW, POST, GET, PROPFIND, WHEN",
1656
- "Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
1666
+ "Refresh" => "Refresh: 20; https://ietf.org/rfc/rfc2324.txt"
1657
1667
  body "I'm a tea pot!"
1658
1668
  end
1659
1669
  ```
@@ -1661,12 +1671,12 @@ end
1661
1671
  Как и `body`, методы `headers` и `status`, вызванные без аргументов,
1662
1672
  возвращают свои текущие значения.
1663
1673
 
1664
- ### Стриминг ответов
1674
+ ### Потоковые ответы
1665
1675
 
1666
1676
  Иногда требуется начать отправлять данные клиенту прямо в процессе
1667
1677
  генерирования частей этих данных. В особых случаях требуется постоянно
1668
1678
  отправлять данные до тех пор, пока клиент не закроет соединение. Вы можете
1669
- использовать метод `stream` вместо написания собственных "оберток".
1679
+ использовать метод `stream` вместо разработки собственных "обёрток".
1670
1680
 
1671
1681
  ```ruby
1672
1682
  get '/' do
@@ -1680,15 +1690,15 @@ get '/' do
1680
1690
  end
1681
1691
  ```
1682
1692
 
1683
- Что позволяет вам реализовать стриминговые API,
1693
+ Это позволяет вам реализовать стриминговые API,
1684
1694
  [Server Sent Events](https://w3c.github.io/eventsource/),
1685
1695
  и может служить основой для [WebSockets](https://en.wikipedia.org/wiki/WebSocket).
1686
- Также такой подход можно использовать для увеличения производительности в случае,
1687
- когда какая-то часть контента зависит от медленного ресурса.
1696
+ Также такой подход можно использовать для увеличения производительности в том случае,
1697
+ когда какая-то часть контента (а не весь) зависит от медленного ресурса.
1688
1698
 
1689
- Заметьте, что возможности стриминга, особенно количество одновременно
1699
+ Обратите внимание на то, что возможности стриминга, особенно количество одновременно
1690
1700
  обслуживаемых запросов, очень сильно зависят от используемого веб-сервера.
1691
- Некоторые серверы могут и вовсе не поддерживать стриминг. Если сервер не
1701
+ Некоторые серверы могут и вовсе не поддерживать стриминг. Если сервер не
1692
1702
  поддерживает стриминг, то все данные будут отправлены за один раз сразу после
1693
1703
  того, как блок, переданный в `stream`, завершится. Стриминг вообще не работает
1694
1704
  при использовании Shotgun.
@@ -1696,7 +1706,7 @@ end
1696
1706
  Если метод используется с параметром `keep_open`, то он не будет вызывать
1697
1707
  `close` у объекта потока, что позволит вам закрыть его позже в любом другом
1698
1708
  месте. Это работает только с событийными серверами, например, с Thin и
1699
- Rainbows. Другие же серверы все равно будут закрывать поток:
1709
+ Rainbows. Другие же серверы всё равно будут закрывать поток:
1700
1710
 
1701
1711
  ```ruby
1702
1712
  # long polling
@@ -1708,7 +1718,7 @@ get '/subscribe' do
1708
1718
  # регистрация клиента в событиях сервера
1709
1719
  stream(:keep_open) do |out|
1710
1720
  connections << out
1711
- # удаление "мертвых клиентов"
1721
+ # удаление "мёртвых клиентов"
1712
1722
  connections.reject!(&:closed?)
1713
1723
  end
1714
1724
  end
@@ -1728,7 +1738,7 @@ end
1728
1738
  ```
1729
1739
 
1730
1740
  Также клиент может закрыть соединение при попытке записи в сокет. В связи с
1731
- этим рекомендуется проверить `out.closed?` прежде, чем пытаться записать.
1741
+ этим рекомендуется выполнить проверку `out.closed?` прежде, чем пытаться произвести запись.
1732
1742
 
1733
1743
  ### Логирование
1734
1744
 
@@ -1746,9 +1756,9 @@ end
1746
1756
  логирование выключено, то этот метод вернет пустой (dummy) объект, поэтому вы
1747
1757
  можете смело использовать его в маршрутах и фильтрах.
1748
1758
 
1749
- Заметьте, что логирование включено по умолчанию только для
1750
- `Sinatra::Application`, а если ваше приложение подкласс `Sinatra::Base`, то
1751
- вы, наверное, захотите включить его вручную:
1759
+ Обратите внимание на то, что логирование включено по умолчанию только для
1760
+ `Sinatra::Application`. Если ваше приложение является подклассом `Sinatra::Base`, то
1761
+ вы, скорее всего, захотите включить его вручную:
1752
1762
 
1753
1763
  ```ruby
1754
1764
  class MyApp < Sinatra::Base
@@ -1759,8 +1769,8 @@ end
1759
1769
  ```
1760
1770
 
1761
1771
  Чтобы избежать использования любой логирующей "прослойки", задайте опции
1762
- `logging` значение `nil`. Тем не менее, не забывайте, что в такой ситуации
1763
- `logger` вернет `nil`. Чаще всего так делают, когда задают свой собственный
1772
+ `logging` значение `nil`. При этом не забывайте, что в такой ситуации
1773
+ `logger` будет возвращать `nil`. Чаще всего так делают, когда задают свой собственный
1764
1774
  логер. Sinatra будет использовать то, что находится в `env['rack.logger']`.
1765
1775
 
1766
1776
  ### Mime-типы
@@ -1775,7 +1785,7 @@ configure do
1775
1785
  end
1776
1786
  ```
1777
1787
 
1778
- Вы также можете использовать это в `content_type` методе-помощнике:
1788
+ Вы также можете использовать это в методе-помощнике `content_type`:
1779
1789
 
1780
1790
  ```ruby
1781
1791
  get '/' do
@@ -1799,7 +1809,7 @@ end
1799
1809
 
1800
1810
  ### Перенаправление (редирект)
1801
1811
 
1802
- Вы можете перенаправить браузер пользователя с помощью метода `redirect`:
1812
+ Вы можете перенаправить браузер пользователя при помощи метода `redirect`:
1803
1813
 
1804
1814
  ```ruby
1805
1815
  get '/foo' do
@@ -1816,7 +1826,7 @@ redirect 'http://www.google.com/', 'wrong place, buddy'
1816
1826
  ```
1817
1827
 
1818
1828
  Вы также можете перенаправить пользователя обратно на страницу, с которой он
1819
- пришел, с помощью `redirect back`:
1829
+ пришёл, при помощи `redirect back`:
1820
1830
 
1821
1831
  ```ruby
1822
1832
  get '/foo' do
@@ -1829,8 +1839,8 @@ get '/bar' do
1829
1839
  end
1830
1840
  ```
1831
1841
 
1832
- Чтобы передать какие-либо параметры вместе с перенаправлением, либо добавьте
1833
- их в строку запроса:
1842
+ Для того, чтобы передать какие-либо параметры вместе с перенаправлением,
1843
+ добавьте их в строку запроса:
1834
1844
 
1835
1845
  ```ruby
1836
1846
  redirect to('/bar?sum=42')
@@ -1855,7 +1865,7 @@ end
1855
1865
 
1856
1866
  Установка корректных заголовков — основа правильного HTTP кэширования.
1857
1867
 
1858
- Вы можете легко выставить заголовок Cache-Control таким образом:
1868
+ Вы можете легко выставить заголовок Cache-Control следующим образом:
1859
1869
 
1860
1870
  ```ruby
1861
1871
  get '/' do
@@ -1881,10 +1891,11 @@ before do
1881
1891
  end
1882
1892
  ```
1883
1893
 
1884
- Чтобы как следует использовать кэширование, вам следует подумать об
1885
- использовании `etag` или `last_modified`. Рекомендуется использовать эти
1886
- методы-помощники *до* выполнения ресурсоемких вычислений, так как они
1887
- немедленно отправят ответ клиенту, если текущая версия уже есть в их кэше:
1894
+ Чтобы использовать кэширование правильно, вам стоит подумать о
1895
+ применении `etag` или `last_modified`. Рекомендуется использовать эти
1896
+ методы-помощники *до* выполнения ресурсоёмких вычислений, так как они
1897
+ немедленно отправят ответ клиенту в том случае, если текущая версия
1898
+ уже присутствует в их кэше:
1888
1899
 
1889
1900
  ```ruby
1890
1901
  get "/article/:id" do
@@ -1902,9 +1913,9 @@ end
1902
1913
  etag @article.sha1, :weak
1903
1914
  ```
1904
1915
 
1905
- Эти методы-помощники не станут ничего кэшировать для вас, но они дадут
1906
- необходимую информацию для вашего кэша. Если вы ищете легкое решение для
1907
- кэширования, попробуйте [rack-cache](https://github.com/rtomayko/rack-cache):
1916
+ Эти методы-помощники не станут ничего кэшировать, однако они дадут
1917
+ необходимую информацию для вашего кэша. Если вы ищете лёгкое решение для
1918
+ кэширования, попробуйте [rack-cache](https://github.com/rtomayko/rack-cache#readme):
1908
1919
 
1909
1920
  ```ruby
1910
1921
  require "rack/cache"
@@ -1925,9 +1936,9 @@ end
1925
1936
  В соответствии с RFC 2616 ваше приложение должно вести себя по-разному, когда
1926
1937
  заголовки If-Match или If-None-Match имеют значение `*`, в зависимости от
1927
1938
  того, существует или нет запрашиваемый ресурс. Sinatra предполагает, что
1928
- ресурсы, к которым обращаются с помощью безопасных (GET) и идемпотентных (PUT)
1939
+ ресурсы, к которым обращаются при помощи безопасных (GET) и идемпотентных (PUT)
1929
1940
  методов, уже существуют, а остальные ресурсы (к которым обращаются, например,
1930
- с помощью POST) считает новыми. Вы можете изменить данное поведение с помощью
1941
+ при помощи POST) считает новыми. Вы можете изменить данное поведение при помощи
1931
1942
  опции `:new_resource`:
1932
1943
 
1933
1944
  ```ruby
@@ -1984,8 +1995,8 @@ send_file 'foo.png', :type => :jpg
1984
1995
 
1985
1996
  <dt>status</dt>
1986
1997
  <dd>
1987
- Код ответа. Полезно, когда отсылается статический файл в качестве страницы с
1988
- сообщением об ошибке. Если поддерживается обработчик Rack, будут использоваться
1998
+ Код ответа. Полезно в том случае, когда отсылается статический файл в качестве
1999
+ страницы с сообщением об ошибке. Если поддерживается обработчик Rack, будут использоваться
1989
2000
  другие средства, кроме потоковой передачи из процесса Ruby. Если вы используете
1990
2001
  этот вспомогательный метод, Sinatra автоматически обрабатывает запросы диапазона.
1991
2002
  </dd>
@@ -1994,7 +2005,7 @@ send_file 'foo.png', :type => :jpg
1994
2005
  ### Доступ к объекту запроса
1995
2006
 
1996
2007
  Объект входящего запроса доступен на уровне обработки запроса (в фильтрах,
1997
- маршрутах, обработчиках ошибок) с помощью `request` метода:
2008
+ маршрутах, обработчиках ошибок) при помощи `request` метода:
1998
2009
 
1999
2010
  ```ruby
2000
2011
  # приложение запущено на http://example.com/example
@@ -2015,22 +2026,22 @@ get '/foo' do
2015
2026
  request.host # "example.com"
2016
2027
  request.get? # true (есть аналоги для других методов HTTP)
2017
2028
  request.form_data? # false
2018
- request["some_param"] # значение параметра some_param. Шорткат для хеша params
2029
+ request["some_param"] # значение параметра some_param. Шорткат для хэша params
2019
2030
  request.referrer # источник запроса клиента либо '/'
2020
2031
  request.user_agent # user agent (используется для :agent условия)
2021
- request.cookies # хеш, содержащий cookies браузера
2032
+ request.cookies # хэш, содержащий cookies браузера
2022
2033
  request.xhr? # является ли запрос ajax запросом?
2023
2034
  request.url # "http://example.com/example/foo"
2024
2035
  request.path # "/example/foo"
2025
2036
  request.ip # IP-адрес клиента
2026
2037
  request.secure? # false (true, если запрос сделан через SSL)
2027
2038
  request.forwarded? # true (если сервер работает за обратным прокси)
2028
- request.env # "сырой" env хеш, полученный Rack
2039
+ request.env # "сырой" env хэш, полученный Rack
2029
2040
  end
2030
2041
  ```
2031
2042
 
2032
2043
  Некоторые опции, такие как `script_name` или `path_info`, доступны для
2033
- изменения:
2044
+ модификации:
2034
2045
 
2035
2046
  ```ruby
2036
2047
  before { request.path_info = "/" }
@@ -2052,8 +2063,8 @@ end
2052
2063
 
2053
2064
  ### Вложения
2054
2065
 
2055
- Вы можете использовать метод `attachment`, чтобы сказать браузеру, что ответ
2056
- сервера должен быть сохранен на диск, а не отображен:
2066
+ Вы можете использовать метод `attachment`, чтобы сообщить браузеру о том,
2067
+ что ответ сервера должен быть сохранён на диск, а не отображён:
2057
2068
 
2058
2069
  ```ruby
2059
2070
  get '/' do
@@ -2075,7 +2086,7 @@ end
2075
2086
 
2076
2087
  Sinatra предлагает метод-помощник `time_for`, который из заданного значения
2077
2088
  создает объект Time. Он также может конвертировать `DateTime`, `Date` и
2078
- подобные классы:
2089
+ схожие классы:
2079
2090
 
2080
2091
  ```ruby
2081
2092
  get '/' do
@@ -2086,7 +2097,7 @@ end
2086
2097
 
2087
2098
  Этот метод используется внутри Sinatra методами `expires`, `last_modified` и
2088
2099
  им подобными. Поэтому вы легко можете изменить и дополнить поведение этих методов,
2089
- переопределив `time_for` в своем приложении:
2100
+ переопределив `time_for` в своём приложении:
2090
2101
 
2091
2102
  ```ruby
2092
2103
  helpers do
@@ -2106,7 +2117,7 @@ get '/' do
2106
2117
  end
2107
2118
  ```
2108
2119
 
2109
- ### Поиск шаблонов
2120
+ ### Поиск файлов шаблонов
2110
2121
 
2111
2122
  Для поиска шаблонов и их последующего рендеринга используется метод
2112
2123
  `find_template`:
@@ -2149,18 +2160,17 @@ end
2149
2160
 
2150
2161
  Вы можете легко вынести этот код в расширение и поделиться им с остальными!
2151
2162
 
2152
- Заметьте, что `find_template` не проверяет, существует ли файл на самом деле,
2153
- а вызывает заданный блок для всех возможных путей. Дело тут не в
2154
- производительности, дело в том, что `render` вызовет `break`, как только файл
2155
- будет найден. Содержимое и местонахождение шаблонов будет закэшировано, если
2156
- приложение запущено не в режиме разработки (`set :environment, :development`).
2163
+ Обратите внимание на тот факт, что `find_template` не проверяет, существует ли
2164
+ файл на самом деле, а вызывает заданный блок для всех возможных путей. Дело тут не в
2165
+ производительности, а в том, что `render` вызовет `break` как только файл
2166
+ будет найден. Содержимое и местонахождение шаблонов будет закэшировано в том случае,
2167
+ если приложение запущено не в режиме разработки (`set :environment, :development`).
2157
2168
  Вы должны помнить об этих нюансах, если пишите по-настоящему "сумасшедший"
2158
2169
  метод.
2159
2170
 
2160
2171
  ## Конфигурация
2161
2172
 
2162
- Этот блок исполняется один раз при старте в любом окружении, режиме
2163
- (environment):
2173
+ Этот блок исполняется один раз при старте в любом окружении (environment):
2164
2174
 
2165
2175
  ```ruby
2166
2176
  configure do
@@ -2181,7 +2191,8 @@ configure do
2181
2191
  end
2182
2192
  ```
2183
2193
 
2184
- Будет запущено, когда окружение (`APP_ENV` переменная) `:production`:
2194
+ Следующий пример будет выполнен только тогда, когда окружение
2195
+ (переменная `APP_ENV`) будет задана как `:production`:
2185
2196
 
2186
2197
  ```ruby
2187
2198
  configure :production do
@@ -2189,7 +2200,8 @@ configure :production do
2189
2200
  end
2190
2201
  ```
2191
2202
 
2192
- Будет запущено, когда окружение `:production` или `:test`:
2203
+ Следующий код будет выполнен в том случае, когда окружение
2204
+ будет задано как `:production` или `:test`:
2193
2205
 
2194
2206
  ```ruby
2195
2207
  configure :production, :test do
@@ -2197,7 +2209,7 @@ configure :production, :test do
2197
2209
  end
2198
2210
  ```
2199
2211
 
2200
- Вы можете получить доступ к этим опциям с помощью `settings`:
2212
+ Вы можете получить доступ к этим опциям при помощи метода `settings`:
2201
2213
 
2202
2214
  ```ruby
2203
2215
  configure do
@@ -2216,14 +2228,14 @@ end
2216
2228
  Sinatra использует
2217
2229
  [Rack::Protection](https://github.com/sinatra/rack-protection#readme) для защиты
2218
2230
  приложения от простых атак. Вы можете легко выключить эту защиту (что сделает
2219
- ваше приложение чрезвычайно уязвимым):
2231
+ ваше приложение чрезвычайно уязвимым к большому числу различных уязвимостей):
2220
2232
 
2221
2233
  ```ruby
2222
2234
  disable :protection
2223
2235
  ```
2224
2236
 
2225
- Чтобы пропустить какой-либо уровень защиты, передайте хеш опций в параметр
2226
- `protection`:
2237
+ Чтобы отключить какой-либо конкретный уровень защиты, передайте хэш опций
2238
+ в параметр `protection`:
2227
2239
 
2228
2240
  ```ruby
2229
2241
  set :protection, :except => :path_traversal
@@ -2236,10 +2248,10 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2236
2248
  ```
2237
2249
 
2238
2250
  По умолчанию Sinatra будет устанавливать `session based` защиту только если
2239
- включена опция `:sessions`. См. 'Использование сессий'. Иногда вы захотите
2240
- настроить сессии "вне" приложения Sinatra, например, в config.ru или с помощью
2241
- отдельного экземпляра `Rack::Builder`. В этом случае вы также можете настроить
2242
- `session based` защиту, передав опцию `:session`:
2251
+ включена опция `:sessions`. См. ["Использование сессий""](#Использование-сессий).
2252
+ Иногда вы захотите настроить сессии "вне" приложения Sinatra, например, в
2253
+ config.ru или при помощи отдельного экземпляра `Rack::Builder`. В таком случае
2254
+ вы также можете настроить `session based` защиту, передав опцию `:session`:
2243
2255
 
2244
2256
  ```ruby
2245
2257
  set :protection, :session => true
@@ -2256,9 +2268,9 @@ set :protection, :session => true
2256
2268
  </dd>
2257
2269
  <dd>
2258
2270
  включайте эту опцию, если ваше приложение работает за обратным прокси,
2259
- который настроен не совсем корректно. Обратите внимание, метод <tt>url</tt> все
2260
- равно будет генерировать абсолютные URL, если вы не передадите <tt>false</tt>
2261
- вторым аргументом.
2271
+ который настроен не совсем корректно. Обратите внимание на тот факт, что
2272
+ метод <tt>url</tt> всё равно будет генерировать абсолютные URL в том случае,
2273
+ если вы не передадите <tt>false</tt> вторым аргументом.
2262
2274
  </dd>
2263
2275
  <dd>отключено по умолчанию.</dd>
2264
2276
 
@@ -2266,7 +2278,7 @@ set :protection, :session => true
2266
2278
  <dd>
2267
2279
  mime-типы, к которым метод <tt>content_type</tt> будет автоматически добавлять
2268
2280
  информацию о кодировке. Вам следует добавлять значения к этой опции
2269
- вместо ее переопределения: <tt>settings.add_charset << "application/foobar"</tt>
2281
+ вместо её переопределения: <tt>settings.add_charset << "application/foobar"</tt>
2270
2282
  </dd>
2271
2283
 
2272
2284
  <dt>app_file</dt>
@@ -2279,7 +2291,7 @@ set :protection, :session => true
2279
2291
  <dt>bind</dt>
2280
2292
  <dd>
2281
2293
  используемый IP-адрес (по умолчанию: <tt>0.0.0.0</tt> <em>или</em>
2282
- <tt>localhost</tt> если ваша `environment` настроена на разработку).
2294
+ <tt>localhost</tt> если опция `environment` настроена на "development").
2283
2295
  Используется только встроенным сервером.
2284
2296
  </dd>
2285
2297
 
@@ -2300,18 +2312,18 @@ set :protection, :session => true
2300
2312
 
2301
2313
  <dt>lock</dt>
2302
2314
  <dd>
2303
- создает блокировку для каждого запроса, которая гарантирует обработку
2315
+ создаёт блокировку для каждого запроса, которая гарантирует обработку
2304
2316
  только одного запроса в текущий момент времени в Ruby процессе.
2305
2317
  </dd>
2306
2318
  <dd>
2307
- включайте, если ваше приложение не потоко-безопасно (thread-safe).
2319
+ включайте в том случае, если ваше приложение не потокобезопасно (thread-safe).
2308
2320
  Отключено по умолчанию.
2309
2321
  </dd>
2310
2322
 
2311
2323
  <dt>method_override</dt>
2312
2324
  <dd>
2313
- использовать "магический" параметр <tt>_method</tt>, для поддержки
2314
- PUT/DELETE форм в браузерах, которые не поддерживают эти методы.
2325
+ использовать "магический" параметр <tt>_method</tt> для поддержки
2326
+ PUT/DELETE форм в браузерах, которые не поддерживают данные методы.
2315
2327
  </dd>
2316
2328
 
2317
2329
  <dt>mustermann_opts</dt>
@@ -2383,20 +2395,30 @@ set :protection, :session => true
2383
2395
  <dt>server</dt>
2384
2396
  <dd>
2385
2397
  сервер или список серверов, которые следует использовать в качестве
2386
- встроенного сервера. Порядок задает приоритет, по умолчанию зависит
2398
+ встроенного сервера. Порядок задаёт приоритет, по умолчанию зависит
2387
2399
  от реализации Ruby.
2388
2400
  </dd>
2389
2401
 
2402
+ <dt>server_settings</dt>
2403
+ <dd>
2404
+ Если вы используете в качестве сервера WEBrick, например для работы в
2405
+ режиме разработки, то вы можете передать набор опций для <tt>server_settings</tt>,
2406
+ таких как <tt>SSLEnable</tt> или <tt>SSLVerifyClient</tt>. Тем не менее, такие
2407
+ серверы как Puma или Thin не поддерживают эти параметры, поэтому вы можете
2408
+ устанавливать <tt>server_settings</tt> указав его как метод при вызове
2409
+ <tt>configure</tt>.
2410
+ </dd>
2411
+
2390
2412
  <dt>sessions</dt>
2391
2413
  <dd>
2392
2414
  включить сессии на основе кук (cookie) на базе <tt>Rack::Session::Cookie</tt>.
2393
- Смотрите секцию "Использование сессий" выше.
2415
+ Смотрите раздел "Использование сессий" выше.
2394
2416
  </dd>
2395
2417
 
2396
2418
  <dt>session_store</dt>
2397
2419
  <dd>
2398
- используется Rack "прослойка" сессии. По умолчанию <tt>Rack::Session::Cookie</tt>.
2399
- Смотрите секцию "Использование сессий" выше.
2420
+ используемая Rack "прослойка" для сессии. По умолчанию <tt>Rack::Session::Cookie</tt>.
2421
+ Смотрите раздел "Использование сессий" выше.
2400
2422
  </dd>
2401
2423
 
2402
2424
  <dt>show_exceptions</dt>
@@ -2406,19 +2428,19 @@ set :protection, :session => true
2406
2428
  </dd>
2407
2429
  <dd>
2408
2430
  может также быть установлено в <tt>:after_handler</tt> для запуска специфичной
2409
- для приложения обработки ошибок, перед показом трассировки стека в браузере.
2431
+ для приложения обработки ошибок, перед показом трассировки стека в браузере.
2410
2432
  </dd>
2411
2433
 
2412
2434
  <dt>static</dt>
2413
- <dd>должна ли Sinatra осуществлять раздачу статических файлов.</dd>
2414
- <dd>Отключите, когда используете какой-либо веб-сервер для этой цели.</dd>
2435
+ <dd>указывает, должна ли Sinatra осуществлять раздачу статических файлов.</dd>
2436
+ <dd>Отключите, если используете какой-либо веб-сервер для этой цели.</dd>
2415
2437
  <dd>Отключение значительно улучшит производительность приложения.</dd>
2416
2438
  <dd>По умолчанию включено в классических и отключено в модульных приложениях.</dd>
2417
2439
 
2418
2440
  <dt>static_cache_control</dt>
2419
2441
  <dd>
2420
- когда Sinatra отдает статические файлы, используйте эту опцию, чтобы
2421
- добавить им заголовок <tt>Cache-Control</tt>. Для этого используется
2442
+ когда Sinatra раздаёт статические файлы, используйте эту опцию для того,
2443
+ чтобы добавить им заголовок <tt>Cache-Control</tt>. Для этого используется
2422
2444
  метод-помощник <tt>cache_control</tt>. По умолчанию отключено.
2423
2445
  </dd>
2424
2446
  <dd>
@@ -2433,38 +2455,38 @@ set :protection, :session => true
2433
2455
  </dd>
2434
2456
 
2435
2457
  <dt>traps</dt>
2436
- <dd>должна ли Sinatra обрабатывать системные сигналы или нет.</tt></dd>
2458
+ <dd>указывает, должна ли Sinatra обрабатывать системные сигналы.</tt></dd>
2437
2459
 
2438
2460
  <dt>views</dt>
2439
2461
  <dd>
2440
- путь к директории с шаблонами. Берётся из настройки <tt>app_file</tt>,
2441
- если не установлен.
2462
+ путь к директории с шаблонами. Берётся из настройки <tt>app_file</tt> в том
2463
+ случае, если не установлен.
2442
2464
  </dd>
2443
2465
 
2444
2466
  <dt>x_cascade</dt>
2445
2467
  <dd>
2446
- Установлен ли заголовок X-Cascade если никакие маршруты не совпадают.
2468
+ Указывает, необходимо ли устанавливать заголовок X-Cascade если никакие маршруты не совпадают.
2447
2469
  <tt>true</tt> по умолчанию.
2448
2470
  </dd>
2449
2471
  </dl>
2450
2472
 
2451
2473
  ## Режим, окружение
2452
2474
 
2453
- Есть 3 предопределенных режима, окружения: `"development"`, `"production"` и
2454
- `"test"`. Режим может быть задан через переменную окружения `APP_ENV`.
2475
+ Есть 3 предопределённых режима работы приложения (окружения): `"development"`,
2476
+ `"production"` и `"test"`. Режим может быть задан через переменную окружения `APP_ENV`.
2455
2477
  Значение по умолчанию — `"development"`. В этом режиме работы все шаблоны
2456
- перезагружаются между запросами. А также задаются специальные обработчики
2478
+ перезагружаются между запросами, а также задаются специальные обработчики
2457
2479
  `not_found` и `error`, чтобы вы могли увидеть стек вызовов. В окружениях
2458
2480
  `"production"` и `"test"` шаблоны по умолчанию кэшируются.
2459
2481
 
2460
- Для запуска приложения в определенном окружении установите переменную
2482
+ Для запуска приложения в определённом окружении установите переменную
2461
2483
  окружения `APP_ENV`:
2462
2484
 
2463
2485
  ```shell
2464
2486
  APP_ENV=production ruby my_app.rb
2465
2487
  ```
2466
2488
 
2467
- Вы можете использовать предопределенные методы `development?`, `test?` и
2489
+ Вы можете использовать предопределённые методы `development?`, `test?` и
2468
2490
  `production?`, чтобы определить текущее окружение.
2469
2491
 
2470
2492
  ```ruby
@@ -2479,14 +2501,14 @@ end
2479
2501
 
2480
2502
  ## Обработка ошибок
2481
2503
 
2482
- Обработчики ошибок исполняются в том же контексте, что и маршруты, и
2504
+ Обработчики ошибок исполняются в том же контексте, что и маршруты и
2483
2505
  `before`-фильтры, а это означает, что всякие прелести вроде `haml`, `erb`,
2484
2506
  `halt` и т.д. доступны и им.
2485
2507
 
2486
2508
  ### Not Found
2487
2509
 
2488
- Когда выброшено исключение `Sinatra::NotFound`, или кодом ответа является 404,
2489
- то будет вызван `not_found` обработчик:
2510
+ В случае возникновения исключения `Sinatra::NotFound` или возврата кода ответа 404
2511
+ будет вызван обработчик `not_found`:
2490
2512
 
2491
2513
  ```ruby
2492
2514
  not_found do
@@ -2496,9 +2518,9 @@ end
2496
2518
 
2497
2519
  ### Error
2498
2520
 
2499
- Обработчик ошибок `error` будет вызван, когда исключение выброшено из блока
2500
- маршрута, либо из фильтра. Но заметьте, что в режиме разработки он будет
2501
- запускаться, только если вы установите опцию "show exceptions"
2521
+ Обработчик ошибок `error` будет вызван тогда, когда исключение выброшено из блока
2522
+ маршрута либо из фильтра. Тем не менее, обратите внимание на то, что в режиме разработки
2523
+ он будет запускаться только в том случае, если вы установите опцию "show exceptions"
2502
2524
  на `: after_handler`:
2503
2525
 
2504
2526
  ```ruby
@@ -2513,7 +2535,7 @@ error do
2513
2535
  end
2514
2536
  ```
2515
2537
 
2516
- Конкретные ошибки:
2538
+ Пользовательские ошибки:
2517
2539
 
2518
2540
  ```ruby
2519
2541
  error MyCustomError do
@@ -2521,7 +2543,7 @@ error MyCustomError do
2521
2543
  end
2522
2544
  ```
2523
2545
 
2524
- Тогда, если это произошло:
2546
+ Тогда, если это возникнет:
2525
2547
 
2526
2548
  ```ruby
2527
2549
  get '/' do
@@ -2555,21 +2577,22 @@ error 400..510 do
2555
2577
  end
2556
2578
  ```
2557
2579
 
2558
- Sinatra устанавливает специальные `not_found` и `error` обработчики, когда
2580
+ Sinatra устанавливает специальные обработчики `not_found` и `error`, когда
2559
2581
  приложение запущено в режиме разработки (окружение `:development`) чтобы
2560
- отображать хорошие трассировки стека и дополнительную информацию об отладке
2582
+ отображать информативные трассировки стека и дополнительную информацию об отладке
2561
2583
  в вашем браузере.
2562
2584
 
2563
- ## Rack "прослойка"
2585
+ ## Rack "прослойки"
2564
2586
 
2565
- Sinatra использует [Rack](http://rack.github.io/), минимальный стандартный
2587
+ Sinatra использует [Rack](https://rack.github.io/) - минимальный стандартный
2566
2588
  интерфейс для веб-фреймворков на Ruby. Одной из самых интересных для
2567
2589
  разработчиков возможностей Rack является поддержка "прослоек" ("middleware") —
2568
2590
  компонентов, находящихся "между" сервером и вашим приложением, которые
2569
2591
  отслеживают и/или манипулируют HTTP запросами/ответами для предоставления
2570
2592
  различной функциональности.
2571
2593
 
2572
- В Sinatra очень просто использовать такие "прослойки" с помощью метода `use`:
2594
+ Sinatra позволяет очень просто создавать пайплайны из подобных Rack "прослоек"
2595
+ при помощи метода `use`:
2573
2596
 
2574
2597
  ```ruby
2575
2598
  require 'sinatra'
@@ -2585,7 +2608,7 @@ end
2585
2608
 
2586
2609
  Семантика `use` идентична той, что определена для
2587
2610
  [Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder) DSL
2588
- (чаще всего используется в rackup файлах). Например, метод `use` принимает как
2611
+ (чаще всего используется в rackup файлах). Так, например, метод `use` принимает как
2589
2612
  множественные переменные, так и блоки:
2590
2613
 
2591
2614
  ```ruby
@@ -2597,20 +2620,18 @@ end
2597
2620
  Rack распространяется с различными стандартными "прослойками" для логирования,
2598
2621
  отладки, маршрутизации URL, аутентификации, обработки сессий. Sinatra
2599
2622
  использует многие из этих компонентов автоматически, основываясь на
2600
- конфигурации, чтобы вам не приходилось подключать (`use`) их вручную.
2623
+ конфигурации, чтобы вам не приходилось подключать их при помощи `use` вручную.
2601
2624
 
2602
2625
  Вы можете найти полезные прослойки в
2603
2626
  [rack](https://github.com/rack/rack/tree/master/lib/rack),
2604
2627
  [rack-contrib](https://github.com/rack/rack-contrib#readme),
2605
- или в
2606
- [Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware).
2628
+ или в [Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware).
2607
2629
 
2608
2630
  ## Тестирование
2609
2631
 
2610
- Тесты для Sinatra приложений могут быть написаны с помощью библиотек,
2611
- фреймворков, поддерживающих тестирование Rack.
2612
- [Rack::Test](http://www.rubydoc.info/github/brynary/rack-test/master/frames)
2613
- рекомендован:
2632
+ Тесты для Sinatra приложений могут быть написаны при помощи любых библиотек или
2633
+ фреймворков, поддерживающих тестирование Rack. Разработчики гема Sinatra рекомендуют
2634
+ использовать [Rack::Test](http://www.rubydoc.info/github/brynary/rack-test/master/frames):
2614
2635
 
2615
2636
  ```ruby
2616
2637
  require 'my_sinatra_app'
@@ -2642,7 +2663,7 @@ end
2642
2663
  ```
2643
2664
 
2644
2665
  Примечание: если вы используете Sinatra в модульном стиле, замените
2645
- `Sinatra::Application` в примере выше выше на имя класса вашего приложения.
2666
+ `Sinatra::Application` в примере выше на имя класса вашего приложения.
2646
2667
 
2647
2668
  ## Sinatra::Base — "прослойки", библиотеки и модульные приложения
2648
2669
 
@@ -2651,7 +2672,7 @@ end
2651
2672
  Rack "прослойка", Rails metal, простые библиотеки с серверным компонентом или
2652
2673
  даже расширения Sinatra. Верхний уровень предполагает конфигурацию стиля
2653
2674
  микроприложений (например, одиночный файл приложения, `./public` и `./views`,
2654
- каталоги, логгирование, страницу подробных сведений об исключениях и т.д.).
2675
+ каталоги, логирование, страницу подробных сведений об исключениях и т.д.).
2655
2676
  И тут на помощь приходит `Sinatra::Base`:
2656
2677
 
2657
2678
  ```ruby
@@ -2667,13 +2688,13 @@ class MyApp < Sinatra::Base
2667
2688
  end
2668
2689
  ```
2669
2690
 
2670
- Методы, доступные `Sinatra::Base` подклассам идентичны тем, что доступны
2671
- приложениям в DSL верхнего уровня. Большинство таких приложений могут быть
2672
- конвертированы в `Sinatra::Base` компоненты с помощью двух модификаций:
2691
+ Методы, доступные подклассам `Sinatra::Base` идентичны тем, что доступны
2692
+ приложениям при помощи DSL верхнего уровня. Большинство таких приложений могут быть
2693
+ конвертированы в `Sinatra::Base` компоненты при помощи двух модификаций:
2673
2694
 
2674
2695
  * Вы должны подключать `sinatra/base` вместо `sinatra`, иначе все DSL методы,
2675
2696
  предоставляемые Sinatra, будут импортированы в глобальное пространство
2676
- имен.
2697
+ имён.
2677
2698
  * Поместите все маршруты, обработчики ошибок, фильтры и опции в подкласс
2678
2699
  `Sinatra::Base`.
2679
2700
 
@@ -2681,9 +2702,9 @@ end
2681
2702
  сервер, по умолчанию отключены. Смотрите
2682
2703
  [Опции и конфигурация](http://www.sinatrarb.com/configuration.html)
2683
2704
  для детальной информации об опциях и их поведении. Если вы хотите, чтобы
2684
- поведение было более похоже на то, когда вы определяете свое приложение
2705
+ поведение было более похоже на то, когда вы определяете своё приложение
2685
2706
  на верхнем уровне (также известно как классический стиль), вы можете
2686
- подклассифицировать `Sinatra::Application`:
2707
+ унаследоваться от `Sinatra::Application`:
2687
2708
 
2688
2709
  ```ruby
2689
2710
  require 'sinatra/base'
@@ -2763,7 +2784,7 @@ end
2763
2784
  ### Запуск модульных приложений
2764
2785
 
2765
2786
  Есть два общепринятых способа запускать модульные приложения: запуск напрямую
2766
- с помощью `run!`:
2787
+ при помощи `run!`:
2767
2788
 
2768
2789
  ```ruby
2769
2790
  # my_app.rb
@@ -2783,11 +2804,11 @@ end
2783
2804
  ruby my_app.rb
2784
2805
  ```
2785
2806
 
2786
- Или с помощью конфигурационного файла `config.ru`, который позволяет
2787
- использовать любой Rack-совместимый сервер приложений.
2807
+ Или при помощи конфигурационного файла `config.ru`, который позволяет
2808
+ использовать любой Rack-совместимый сервер приложений:
2788
2809
 
2789
2810
  ```ruby
2790
- # config.ru (запускается с помощью Rackup)
2811
+ # config.ru (запускается при помощи Rackup)
2791
2812
  require './my_app'
2792
2813
  run MyApp
2793
2814
  ```
@@ -2820,17 +2841,16 @@ run Sinatra::Application
2820
2841
 
2821
2842
  ### Когда использовать config.ru?
2822
2843
 
2823
- Вот несколько причин, по которым вы, возможно, захотите использовать
2824
- `config.ru`:
2844
+ Использование файла `config.ru` рекомендовано если:
2825
2845
 
2826
- * вы хотите разворачивать свое приложение на различных Rack-совместимых
2846
+ * вы хотите разворачивать своё приложение на различных Rack-совместимых
2827
2847
  серверах (Passenger, Unicorn, Heroku, ...);
2828
2848
  * вы хотите использовать более одного подкласса `Sinatra::Base`;
2829
2849
  * вы хотите использовать Sinatra только в качестве "прослойки" Rack.
2830
2850
 
2831
2851
  **Совсем необязательно переходить на использование `config.ru` лишь потому,
2832
2852
  что вы стали использовать модульный стиль приложения. И необязательно
2833
- использовать модульный стиль, чтобы запускать приложение с помощью
2853
+ использовать модульный стиль, чтобы запускать приложение при помощи
2834
2854
  `config.ru`.**
2835
2855
 
2836
2856
  ### Использование Sinatra в качестве "прослойки"
@@ -2838,7 +2858,7 @@ run Sinatra::Application
2838
2858
  Не только сама Sinatra может использовать "прослойки" Rack, но и любое Sinatra
2839
2859
  приложение само может быть добавлено к любому Rack endpoint в качестве
2840
2860
  "прослойки". Этим endpoint (конечной точкой) может быть другое Sinatra
2841
- приложение, или приложение, основанное на Rack (Rails/Hamami/Roda/...):
2861
+ приложение или любое другое приложение, основанное на Rack (Rails/Hamami/Roda/...):
2842
2862
 
2843
2863
  ```ruby
2844
2864
  require 'sinatra/base'
@@ -2874,7 +2894,7 @@ end
2874
2894
  ### Создание приложений "на лету"
2875
2895
 
2876
2896
  Иногда требуется создавать Sinatra приложения "на лету" (например, из другого
2877
- приложения). Это возможно с помощью `Sinatra.new`:
2897
+ приложения), не сохраняя их в константу. Это возможно при помощи `Sinatra.new`:
2878
2898
 
2879
2899
  ```ruby
2880
2900
  require 'sinatra/base'
@@ -2886,7 +2906,7 @@ my_app.run!
2886
2906
  наследоваться:
2887
2907
 
2888
2908
  ```ruby
2889
- # config.ru (запускается с помощью Rackup)
2909
+ # config.ru (запускается при помощи Rackup)
2890
2910
  require 'sinatra/base'
2891
2911
 
2892
2912
  controller = Sinatra.new do
@@ -2906,7 +2926,7 @@ end
2906
2926
  Это особенно полезно для тестирования расширений Sinatra и при использовании
2907
2927
  Sinatra внутри вашей библиотеки.
2908
2928
 
2909
- Благодаря этому, использовать Sinatra как "прослойку" очень просто:
2929
+ Это также значительно упрощает использование Sinatra в качестве прослойки:
2910
2930
 
2911
2931
  ```ruby
2912
2932
  require 'sinatra/base'
@@ -2932,7 +2952,7 @@ run RailsProject::Application
2932
2952
  вы не сможете получить доступ к объектам `request` или `session`, так как
2933
2953
  существует только один класс приложения для всех запросов.
2934
2954
 
2935
- Опции, созданные с помощью `set`, являются методами уровня класса:
2955
+ Опции, созданные при помощи `set`, являются методами уровня класса:
2936
2956
 
2937
2957
  ```ruby
2938
2958
  class MyApp < Sinatra::Base
@@ -2946,10 +2966,10 @@ class MyApp < Sinatra::Base
2946
2966
  end
2947
2967
  ```
2948
2968
 
2949
- У вас будет область видимости приложения внутри:
2969
+ У вас будет привязка к области видимости приложения внутри:
2950
2970
 
2951
2971
  * тела вашего класса приложения;
2952
- * методов, определенных расширениями;
2972
+ * методов, определённых расширениями;
2953
2973
  * блока, переданного в `helpers`;
2954
2974
  * блоков, использованных как значения для `set`;
2955
2975
  * блока, переданного в `Sinatra.new`.
@@ -2964,9 +2984,9 @@ end
2964
2984
 
2965
2985
  Для каждого входящего запроса будет создан новый экземпляр вашего приложения,
2966
2986
  и все блоки обработчика будут запущены в этом контексте. В этой области
2967
- видимости вам доступны `request` и `session` объекты, вызовы методов
2987
+ видимости вам доступны `request` и `session` объекты, а также вызовы методов
2968
2988
  рендеринга, такие как `erb` или `haml`. Вы можете получить доступ к области
2969
- видимости приложения из контекста запроса, используя метод-помощник
2989
+ видимости приложения из контекста запроса используя метод-помощник
2970
2990
  `settings`:
2971
2991
 
2972
2992
  ```ruby
@@ -2986,7 +3006,7 @@ class MyApp < Sinatra::Base
2986
3006
  end
2987
3007
  ```
2988
3008
 
2989
- У вас будет область видимости запроса в:
3009
+ У вас будет привязка к области видимости запроса в:
2990
3010
 
2991
3011
  * get, head, post, put, delete, options, patch, link и unlink блоках;
2992
3012
  * before и after фильтрах;
@@ -3006,7 +3026,7 @@ end
3006
3026
  У вас будет контекст делегирования внутри:
3007
3027
 
3008
3028
  * привязки верхнего уровня, если вы сделали `require "sinatra"`;
3009
- * объекта, расширенного с помощью `Sinatra::Delegator`.
3029
+ * объекта, расширенного при помощи `Sinatra::Delegator`.
3010
3030
 
3011
3031
  Посмотрите сами в код: вот
3012
3032
  [примесь Sinatra::Delegator](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/base.rb#L1609-1633)
@@ -3020,7 +3040,7 @@ Sinatra приложения могут быть запущены напряму
3020
3040
  ruby myapp.rb [-h] [-x] [-q] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
3021
3041
  ```
3022
3042
 
3023
- Опции включают:
3043
+ Поддерживаемые опции:
3024
3044
 
3025
3045
  ```
3026
3046
  -h # раздел помощи
@@ -3032,16 +3052,16 @@ ruby myapp.rb [-h] [-x] [-q] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
3032
3052
  -x # включить мьютекс-блокировку (по умолчанию выключена)
3033
3053
  ```
3034
3054
 
3035
- ### Multi-threading
3055
+ ### Многопоточность
3036
3056
 
3037
- _Данный раздел является перефразированным [ответом пользователя Konstantin][so-answer] на StackOverflow_
3057
+ _Данный раздел является перефразированным [ответом пользователя Konstantin](https://stackoverflow.com/a/6282999/5245129) на StackOverflow_
3038
3058
 
3039
3059
  Sinatra не навязывает каких-либо моделей параллелизма, но для этих целей можно
3040
- использовать любой Rack обработчик, например Thin, Puma или WEBrick. Сама
3060
+ использовать любой Rack обработчик (сервер), например Thin, Puma или WEBrick. Сама
3041
3061
  по себе Sinatra потокобезопасна, поэтому нет никаких проблем в использовании
3042
3062
  поточной модели параллелизма в Rack обработчике. Это означает, что когда
3043
3063
  запускается сервер, вы должны указать правильный метод вызова для конкретного
3044
- Rack обработчика. Пример ниже показывает, как можно запустить мультитредовый
3064
+ Rack обработчика. Пример ниже показывает, как можно запустить мультипоточный
3045
3065
  Thin сервер:
3046
3066
 
3047
3067
  ```ruby
@@ -3059,45 +3079,42 @@ App.run!
3059
3079
 
3060
3080
  ```
3061
3081
 
3062
- Чтобы запустить сервер, вы должны выполнить следующую команду:
3082
+ Для запуска сервере выполните следующую команду:
3063
3083
 
3064
3084
  ```shell
3065
3085
  thin --threaded start
3066
3086
  ```
3067
3087
 
3068
-
3069
- [so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
3070
-
3071
3088
  ## Системные требования
3072
3089
 
3073
3090
  Следующие версии Ruby официально поддерживаются:
3074
3091
  <dl>
3075
3092
  <dt>Ruby 2.2</dt>
3076
3093
  <dd>
3077
- 2.2 полностью поддерживается и рекомендуется. В настоящее время нет
3094
+ Версия 2.2 полностью поддерживается и рекомендуется. В настоящее время нет
3078
3095
  планов отказаться от официальной поддержки.
3079
3096
  </dd>
3080
3097
 
3081
3098
  <dt>Rubinius</dt>
3082
3099
  <dd>
3083
3100
  Rubinius официально поддерживается (Rubinius >= 2.x). Рекомендуется
3084
- выполнить <tt>gem install puma</tt>.
3101
+ выполнить <tt>gem install puma</tt>.
3085
3102
  </dd>
3086
3103
 
3087
3104
  <dt>JRuby</dt>
3088
3105
  <dd>
3089
3106
  Официально поддерживается последний стабильный релиз JRuby. Не
3090
- рекомендуется использовать расширений на C в JRuby. Рекомендуется
3091
- выполнить <tt>gem install trinidad</tt>.
3107
+ рекомендуется использовать расширений на C в JRuby. Рекомендуется
3108
+ выполнить <tt>gem install trinidad</tt>.
3092
3109
  </dd>
3093
3110
  </dl>
3094
3111
 
3095
- Версии Ruby старше 2.2.2 больше не поддерживаются в Sinatra 2.0.
3112
+ Версии Ruby ниже 2.2.2 более не поддерживаются в Sinatra 2.0.
3096
3113
 
3097
3114
  Мы также следим за предстоящими к выходу версиями Ruby.
3098
3115
 
3099
- Следующие реализации Ruby не поддерживаются официально, но известно, что на
3100
- них запускается Sinatra:
3116
+ Следующие реализации Ruby не поддерживаются официально, однако известно, что
3117
+ на них запускается Sinatra:
3101
3118
 
3102
3119
  * старые версии JRuby и Rubinius;
3103
3120
  * Ruby Enterprise Edition;
@@ -3118,28 +3135,28 @@ Sinatra должна работать на любой операционной
3118
3135
  Если вы запускаете MacRuby, вы должны выполнить `gem install control_tower`.
3119
3136
 
3120
3137
  Пока невозможно запустить Sinatra на Cardinal, SmallRuby, BlueRuby и на любой
3121
- версии Ruby старше 2.2.
3138
+ версии Ruby ниже 2.2.
3122
3139
 
3123
- ## На острие
3140
+ ## Самая свежая версия
3124
3141
 
3125
- Если вы хотите использовать самый последний код Sinatra, не бойтесь запускать
3126
- свое приложение вместе с кодом из master ветки Sinatra, она весьма стабильна.
3142
+ Если вы хотите использовать самый последний релиз Sinatra, не бойтесь запускать
3143
+ своё приложение вместе с кодом из master ветки Sinatra, так как она весьма стабильна.
3127
3144
 
3128
- Мы также время от времени выпускаем предварительные версии, так что вы можете
3129
- делать так:
3145
+ Мы также время от времени выпускаем предварительные версии, которые вы можете
3146
+ установить следующим образом:
3130
3147
 
3131
3148
  ```shell
3132
3149
  gem install sinatra --pre
3133
3150
  ```
3134
3151
 
3135
- Чтобы воспользоваться некоторыми самыми последними возможностями.
3152
+ таким образом вы сможете воспользоваться некоторыми самыми последними возможностями.
3136
3153
 
3137
- ### С помощью Bundler
3154
+ ### При помощи Bundler
3138
3155
 
3139
- Если вы хотите запускать свое приложение с последней версией Sinatra, то
3156
+ Если вы хотите запускать своё приложение с последней версией Sinatra, то
3140
3157
  рекомендуем использовать [Bundler](http://bundler.io).
3141
3158
 
3142
- Сначала установите Bundler, если у вас его еще нет:
3159
+ Для начала установите Bundler, если у вас его ещё нет:
3143
3160
 
3144
3161
  ```shell
3145
3162
  gem install bundler
@@ -3152,14 +3169,14 @@ source 'https://rubygems.org'
3152
3169
  gem 'sinatra', :github => 'sinatra/sinatra'
3153
3170
 
3154
3171
  # другие зависимости
3155
- gem 'haml' # например, если используете haml
3172
+ gem 'haml' # в том случае, если используете haml
3156
3173
  ```
3157
3174
 
3158
- Обратите внимание, вам нужно будет указывать все зависимости вашего приложения
3159
- в `Gemfile`. Однако, непосредственные зависимости Sinatra (Rack и Tilt)
3160
- Bundler автоматически скачает и добавит.
3175
+ Имейте ввиду, что вам необходимо будет указывать все зависимости вашего приложения
3176
+ в `Gemfile`. Необходимые зависимости самой библиотеки Sinatra (Rack и Tilt)
3177
+ будут автоматически скачаны и добавлены Bundler.
3161
3178
 
3162
- Теперь вы можете запускать свое приложение так:
3179
+ Теперь вы можете запускать своё приложение следующим образом:
3163
3180
 
3164
3181
  ```shell
3165
3182
  bundle exec ruby myapp.rb
@@ -3167,7 +3184,7 @@ bundle exec ruby myapp.rb
3167
3184
 
3168
3185
  ## Версии
3169
3186
 
3170
- Sinatra использует [Semantic Versioning](http://semver.org/), SemVer и
3187
+ Sinatra использует [Semantic Versioning](https://semver.org/): как SemVer, так и
3171
3188
  SemVerTag.
3172
3189
 
3173
3190
  ## Дальнейшее чтение
@@ -3178,11 +3195,11 @@ SemVerTag.
3178
3195
  баг? Нужна помощь? Написали патч?
3179
3196
  * [Отслеживание проблем/ошибок](https://github.com/sinatra/sinatra/issues)
3180
3197
  * [Twitter](https://twitter.com/sinatra)
3181
- * [Группы рассылки](http://groups.google.com/group/sinatrarb/topics)
3182
- * IRC: [#sinatra](irc://chat.freenode.net/#sinatra) на http://freenode.net
3198
+ * [Группы рассылки](https://groups.google.com/forum/#!forum/sinatrarb)
3199
+ * IRC: [#sinatra](irc://chat.freenode.net/#sinatra) на [Freenode](https://freenode.net)
3183
3200
  * [Sinatra и Друзья](https://sinatrarb.slack.com) на Slack, а так же
3184
- [ссылка](https://sinatra-slack.herokuapp.com/) для инвайта.
3185
- * [Sinatra Book](https://github.com/sinatra/sinatra-book/) учебник и сборник рецептов
3201
+ [ссылка для инвайта](https://sinatra-slack.herokuapp.com/).
3202
+ * [Sinatra Book](https://github.com/sinatra/sinatra-book) учебник и сборник рецептов
3186
3203
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) сборник рецептов
3187
3204
  * API документация к [последнему релизу](http://www.rubydoc.info/gems/sinatra)
3188
3205
  или [текущему HEAD](http://www.rubydoc.info/github/sinatra/sinatra) на