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 +5 -5
- data/CHANGELOG.md +65 -43
- data/Gemfile +1 -0
- data/README.de.md +2 -2
- data/README.es.md +2 -2
- data/README.fr.md +2 -2
- data/README.ja.md +15 -16
- data/README.ko.md +2 -2
- data/README.md +1 -1
- data/README.pt-br.md +2 -2
- data/README.ru.md +381 -364
- data/README.zh.md +2 -2
- data/VERSION +1 -1
- data/lib/sinatra/base.rb +7 -6
- data/lib/sinatra/indifferent_hash.rb +5 -0
- data/lib/sinatra/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c6c73742bb14264358d852a59585930faced4fd019996e0674cdd21d92af01ee
|
4
|
+
data.tar.gz: 4c0ecbfcae07c5fdb8f4e704ca6e6a5ad49bb28e329a59c4dc60e2312673927f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82b602487159d2c84a74442b7220d63130113f95a73f762ee6103f7fa569eb79e95a0e77e496ca12700a751e4ce13b6fe3d6daa6ce82f1a509073d3ae0152259
|
7
|
+
data.tar.gz: 0cc9adf3922c8d471c1176667299debc529129194b68dba70f3041c73d339ee18344a479a0d6d9a239918d3a0dc3d5688b55c749a00900b3b8bb0e0081f0deb3
|
data/CHANGELOG.md
CHANGED
@@ -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
|
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
data/README.de.md
CHANGED
@@ -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="
|
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="
|
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>
|
data/README.es.md
CHANGED
@@ -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="
|
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="
|
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>
|
data/README.fr.md
CHANGED
@@ -691,7 +691,7 @@ exemple).
|
|
691
691
|
<table>
|
692
692
|
<tr>
|
693
693
|
<td>Dépendances</td>
|
694
|
-
<td><a href="
|
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="
|
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>
|
data/README.ja.md
CHANGED
@@ -610,7 +610,7 @@ get('/') { markdown :index }
|
|
610
610
|
<table>
|
611
611
|
<tr>
|
612
612
|
<td>依存</td>
|
613
|
-
<td><a href="
|
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="
|
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="
|
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="
|
688
|
-
<a href="
|
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="
|
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="
|
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;
|
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 '
|
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](
|
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]
|
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](
|
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](
|
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
|
-
* [メーリングリスト](
|
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/) コミュニティによるレシピ集
|
data/README.ko.md
CHANGED
@@ -653,7 +653,7 @@ get('/') { markdown :index }
|
|
653
653
|
<table>
|
654
654
|
<tr>
|
655
655
|
<td>의존성</td>
|
656
|
-
<td><a href="
|
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="
|
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="
|
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>
|
data/README.pt-br.md
CHANGED
@@ -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="
|
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="
|
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>
|
data/README.ru.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Sinatra
|
2
2
|
|
3
|
-
[![Build Status](https://secure.travis-ci.org/sinatra/sinatra.svg)](
|
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
|
-
|
36
|
-
|
37
|
-
|
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` и вложенные
|
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
|
-
* [
|
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
|
-
обозначающую любой символ)
|
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
|
-
|
261
|
-
|
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
|
-
|
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 клиенту,
|
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
|
-
Статические файлы
|
428
|
-
|
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
|
-
|
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
|
-
|
473
|
-
`views/layout.erb`, если существует).
|
475
|
+
Данный метод отрендерит шаблон `views/index.erb`, который будет вложен в `views/post.erb`
|
476
|
+
(по умолчанию: `views/layout.erb`, если файл существует).
|
474
477
|
|
475
|
-
Любые опции, не
|
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
|
-
Опции, переданные в метод, переопределяют опции, заданные
|
496
|
+
Опции, переданные в метод, переопределяют опции, заданные при помощи `set`.
|
494
497
|
|
495
498
|
Доступные опции:
|
496
499
|
|
@@ -498,13 +501,13 @@ end
|
|
498
501
|
<dt>locals</dt>
|
499
502
|
<dd>
|
500
503
|
Список локальных переменных, передаваемых в документ.
|
501
|
-
|
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
|
-
|
518
|
-
|
519
|
-
|
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
|
-
По умолчанию
|
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
|
-
Отобразит шаблон,
|
570
|
-
|
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 (
|
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="
|
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="
|
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="
|
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
|
-
|
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="
|
747
|
-
<a href="
|
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
|
-
|
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
|
-
|
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
|
-
|
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="
|
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
|
-
|
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
|
-
|
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
|
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
|
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
|
-
Перед тем, как использовать шаблоны
|
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 затем конвертируется
|
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"};
|
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
|
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` и вложенные
|
1176
|
+
### Шаблоны с `yield` и вложенные лэйауты
|
1168
1177
|
|
1169
|
-
|
1170
|
-
`yield`.
|
1171
|
-
|
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
|
-
Эти инструкции
|
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
|
-
|
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
|
-
|
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`.
|
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
|
-
Сначала зарегистрируйте
|
1279
|
+
Сначала зарегистрируйте собственный движок в Tilt, а затем создайте метод, отвечающий
|
1273
1280
|
за рендеринг:
|
1274
1281
|
|
1275
1282
|
```ruby
|
@@ -1284,13 +1291,13 @@ get '/' do
|
|
1284
1291
|
end
|
1285
1292
|
```
|
1286
1293
|
|
1287
|
-
|
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
|
-
необходимо написать
|
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
|
-
|
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
|
-
|
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
|
-
генератор
|
1425
|
-
случайные значения.
|
1426
|
-
|
1427
|
-
По умолчанию, Sinatra создаёт для вас
|
1428
|
-
|
1429
|
-
несколько экземпляров вашего приложения, и вы
|
1430
|
-
|
1431
|
-
|
1432
|
+
безопасный генератор случайных чисел для его создания. Люди очень плохо
|
1433
|
+
придумывают случайные значения.
|
1434
|
+
|
1435
|
+
По умолчанию, Sinatra создаёт для вас безопасный случайный ключ сессии из
|
1436
|
+
32 байт, однако он будет меняться при каждом перезапуске приложения. Если у
|
1437
|
+
вас есть несколько экземпляров вашего приложения, и вы доверили Sinatra
|
1438
|
+
генерацию ключа, то каждый экземпляр будет иметь отличный ключ сессии,
|
1439
|
+
что, вероятно, не совсем то, что вам необходимо.
|
1432
1440
|
|
1433
1441
|
Для лучшей безопасности и удобства использования
|
1434
|
-
[рекомендуется](https://12factor.net/config) генерировать
|
1442
|
+
[рекомендуется](https://12factor.net/config) генерировать случайный безопасный
|
1435
1443
|
ключ и хранить его в переменной среды на каждом хосте, на котором запущено
|
1436
1444
|
приложение, чтобы все экземпляры вашего приложения использовали один и тот
|
1437
|
-
же ключ. Вы должны периодически менять значение ключа
|
1438
|
-
Вот несколько примеров того, как вы можете создать
|
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
|
-
|
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
|
-
**Переменная среды
|
1473
|
+
**Переменная среды для ключа сессии**
|
1466
1474
|
|
1467
|
-
Задайте переменной среды
|
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
|
-
|
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
|
-
|
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
|
-
Вы
|
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
|
-
потока исполнения. Вы можете сделать это
|
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;
|
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
|
-
|
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
|
-
этим рекомендуется
|
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
|
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`
|
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
|
-
Вы можете перенаправить браузер пользователя
|
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
|
-
|
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
|
-
|
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
|
-
ресурсы, к которым обращаются
|
1939
|
+
ресурсы, к которым обращаются при помощи безопасных (GET) и идемпотентных (PUT)
|
1929
1940
|
методов, уже существуют, а остальные ресурсы (к которым обращаются, например,
|
1930
|
-
|
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
|
-
|
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
|
-
маршрутах, обработчиках ошибок)
|
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. Шорткат для
|
2029
|
+
request["some_param"] # значение параметра some_param. Шорткат для хэша params
|
2019
2030
|
request.referrer # источник запроса клиента либо '/'
|
2020
2031
|
request.user_agent # user agent (используется для :agent условия)
|
2021
|
-
request.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
|
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
|
-
|
2153
|
-
а вызывает заданный блок для всех возможных путей. Дело тут не в
|
2154
|
-
производительности,
|
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
|
-
|
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
|
-
|
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
|
-
Вы можете получить доступ к этим опциям
|
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, например, в
|
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
|
-
который настроен не совсем корректно. Обратите
|
2260
|
-
равно будет генерировать абсолютные URL
|
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
|
-
вместо
|
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> если
|
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
|
-
|
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
|
-
|
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
|
2414
|
-
<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
|
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
|
-
|
2468
|
+
Указывает, необходимо ли устанавливать заголовок X-Cascade если никакие маршруты не совпадают.
|
2447
2469
|
<tt>true</tt> по умолчанию.
|
2448
2470
|
</dd>
|
2449
2471
|
</dl>
|
2450
2472
|
|
2451
2473
|
## Режим, окружение
|
2452
2474
|
|
2453
|
-
Есть 3
|
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
|
-
Вы можете использовать
|
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
|
-
|
2489
|
-
|
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
|
-
|
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](
|
2587
|
+
Sinatra использует [Rack](https://rack.github.io/) - минимальный стандартный
|
2566
2588
|
интерфейс для веб-фреймворков на Ruby. Одной из самых интересных для
|
2567
2589
|
разработчиков возможностей Rack является поддержка "прослоек" ("middleware") —
|
2568
2590
|
компонентов, находящихся "между" сервером и вашим приложением, которые
|
2569
2591
|
отслеживают и/или манипулируют HTTP запросами/ответами для предоставления
|
2570
2592
|
различной функциональности.
|
2571
2593
|
|
2572
|
-
|
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 файлах).
|
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
|
-
конфигурации, чтобы вам не приходилось подключать
|
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
|
-
приложениям
|
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
|
-
|
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
|
-
|
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
|
-
Или
|
2787
|
-
использовать любой Rack-совместимый сервер
|
2807
|
+
Или при помощи конфигурационного файла `config.ru`, который позволяет
|
2808
|
+
использовать любой Rack-совместимый сервер приложений:
|
2788
2809
|
|
2789
2810
|
```ruby
|
2790
|
-
# config.ru (запускается
|
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
|
-
* вы хотите разворачивать
|
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
|
-
|
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
|
-
приложения)
|
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 (запускается
|
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
|
-
|
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
|
-
Опции, созданные
|
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
|
-
* объекта, расширенного
|
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
|
-
###
|
3055
|
+
### Многопоточность
|
3036
3056
|
|
3037
|
-
_Данный раздел является перефразированным [ответом пользователя Konstantin]
|
3057
|
+
_Данный раздел является перефразированным [ответом пользователя Konstantin](https://stackoverflow.com/a/6282999/5245129) на StackOverflow_
|
3038
3058
|
|
3039
3059
|
Sinatra не навязывает каких-либо моделей параллелизма, но для этих целей можно
|
3040
|
-
использовать любой Rack
|
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
|
-
|
3101
|
+
выполнить <tt>gem install puma</tt>.
|
3085
3102
|
</dd>
|
3086
3103
|
|
3087
3104
|
<dt>JRuby</dt>
|
3088
3105
|
<dd>
|
3089
3106
|
Официально поддерживается последний стабильный релиз JRuby. Не
|
3090
|
-
|
3091
|
-
|
3107
|
+
рекомендуется использовать расширений на C в JRuby. Рекомендуется
|
3108
|
+
выполнить <tt>gem install trinidad</tt>.
|
3092
3109
|
</dd>
|
3093
3110
|
</dl>
|
3094
3111
|
|
3095
|
-
Версии Ruby
|
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
|
3138
|
+
версии Ruby ниже 2.2.
|
3122
3139
|
|
3123
|
-
##
|
3140
|
+
## Самая свежая версия
|
3124
3141
|
|
3125
|
-
Если вы хотите использовать самый последний
|
3126
|
-
|
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
|
-
###
|
3154
|
+
### При помощи Bundler
|
3138
3155
|
|
3139
|
-
Если вы хотите запускать
|
3156
|
+
Если вы хотите запускать своё приложение с последней версией Sinatra, то
|
3140
3157
|
рекомендуем использовать [Bundler](http://bundler.io).
|
3141
3158
|
|
3142
|
-
|
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' #
|
3172
|
+
gem 'haml' # в том случае, если используете haml
|
3156
3173
|
```
|
3157
3174
|
|
3158
|
-
|
3159
|
-
в `Gemfile`.
|
3160
|
-
|
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](
|
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
|
-
* [Группы рассылки](
|
3182
|
-
* IRC: [#sinatra](irc://chat.freenode.net/#sinatra) на
|
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) на
|