sinatra-acd 1.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +5 -0
- data/AUTHORS +61 -0
- data/CHANGES +1293 -0
- data/Gemfile +76 -0
- data/LICENSE +23 -0
- data/README.de.md +2864 -0
- data/README.es.md +2786 -0
- data/README.fr.md +2924 -0
- data/README.hu.md +694 -0
- data/README.ja.md +2726 -0
- data/README.ko.md +2832 -0
- data/README.md +2980 -0
- data/README.pt-br.md +965 -0
- data/README.pt-pt.md +791 -0
- data/README.ru.md +2799 -0
- data/README.zh.md +2158 -0
- data/Rakefile +199 -0
- data/examples/chat.rb +61 -0
- data/examples/simple.rb +3 -0
- data/examples/stream.ru +26 -0
- data/lib/sinatra.rb +4 -0
- data/lib/sinatra/base.rb +2044 -0
- data/lib/sinatra/images/404.png +0 -0
- data/lib/sinatra/images/500.png +0 -0
- data/lib/sinatra/main.rb +34 -0
- data/lib/sinatra/show_exceptions.rb +345 -0
- data/lib/sinatra/version.rb +3 -0
- data/sinatra.gemspec +19 -0
- data/test/asciidoctor_test.rb +72 -0
- data/test/base_test.rb +171 -0
- data/test/builder_test.rb +91 -0
- data/test/coffee_test.rb +90 -0
- data/test/compile_test.rb +183 -0
- data/test/contest.rb +100 -0
- data/test/creole_test.rb +65 -0
- data/test/delegator_test.rb +160 -0
- data/test/encoding_test.rb +20 -0
- data/test/erb_test.rb +116 -0
- data/test/extensions_test.rb +98 -0
- data/test/filter_test.rb +487 -0
- data/test/haml_test.rb +109 -0
- data/test/helper.rb +131 -0
- data/test/helpers_test.rb +1917 -0
- data/test/integration/app.rb +79 -0
- data/test/integration_helper.rb +236 -0
- data/test/integration_test.rb +104 -0
- data/test/less_test.rb +69 -0
- data/test/liquid_test.rb +77 -0
- data/test/mapped_error_test.rb +285 -0
- data/test/markaby_test.rb +80 -0
- data/test/markdown_test.rb +82 -0
- data/test/mediawiki_test.rb +68 -0
- data/test/middleware_test.rb +68 -0
- data/test/nokogiri_test.rb +67 -0
- data/test/public/favicon.ico +0 -0
- data/test/rabl_test.rb +89 -0
- data/test/rack_test.rb +45 -0
- data/test/radius_test.rb +59 -0
- data/test/rdoc_test.rb +66 -0
- data/test/readme_test.rb +130 -0
- data/test/request_test.rb +97 -0
- data/test/response_test.rb +63 -0
- data/test/result_test.rb +76 -0
- data/test/route_added_hook_test.rb +59 -0
- data/test/routing_test.rb +1412 -0
- data/test/sass_test.rb +115 -0
- data/test/scss_test.rb +88 -0
- data/test/server_test.rb +48 -0
- data/test/settings_test.rb +582 -0
- data/test/sinatra_test.rb +12 -0
- data/test/slim_test.rb +102 -0
- data/test/static_test.rb +236 -0
- data/test/streaming_test.rb +149 -0
- data/test/stylus_test.rb +90 -0
- data/test/templates_test.rb +382 -0
- data/test/textile_test.rb +65 -0
- data/test/views/a/in_a.str +1 -0
- data/test/views/ascii.erb +2 -0
- data/test/views/b/in_b.str +1 -0
- data/test/views/calc.html.erb +1 -0
- data/test/views/error.builder +3 -0
- data/test/views/error.erb +3 -0
- data/test/views/error.haml +3 -0
- data/test/views/error.sass +2 -0
- data/test/views/explicitly_nested.str +1 -0
- data/test/views/foo/hello.test +1 -0
- data/test/views/hello.asciidoc +1 -0
- data/test/views/hello.builder +1 -0
- data/test/views/hello.coffee +1 -0
- data/test/views/hello.creole +1 -0
- data/test/views/hello.erb +1 -0
- data/test/views/hello.haml +1 -0
- data/test/views/hello.less +5 -0
- data/test/views/hello.liquid +1 -0
- data/test/views/hello.mab +1 -0
- data/test/views/hello.md +1 -0
- data/test/views/hello.mediawiki +1 -0
- data/test/views/hello.nokogiri +1 -0
- data/test/views/hello.rabl +2 -0
- data/test/views/hello.radius +1 -0
- data/test/views/hello.rdoc +1 -0
- data/test/views/hello.sass +2 -0
- data/test/views/hello.scss +3 -0
- data/test/views/hello.slim +1 -0
- data/test/views/hello.str +1 -0
- data/test/views/hello.styl +2 -0
- data/test/views/hello.test +1 -0
- data/test/views/hello.textile +1 -0
- data/test/views/hello.wlang +1 -0
- data/test/views/hello.yajl +1 -0
- data/test/views/layout2.builder +3 -0
- data/test/views/layout2.erb +2 -0
- data/test/views/layout2.haml +2 -0
- data/test/views/layout2.liquid +2 -0
- data/test/views/layout2.mab +2 -0
- data/test/views/layout2.nokogiri +3 -0
- data/test/views/layout2.rabl +3 -0
- data/test/views/layout2.radius +2 -0
- data/test/views/layout2.slim +3 -0
- data/test/views/layout2.str +2 -0
- data/test/views/layout2.test +1 -0
- data/test/views/layout2.wlang +2 -0
- data/test/views/nested.str +1 -0
- data/test/views/utf8.erb +2 -0
- data/test/wlang_test.rb +87 -0
- data/test/yajl_test.rb +86 -0
- metadata +280 -0
data/README.ru.md
ADDED
@@ -0,0 +1,2799 @@
|
|
1
|
+
# Sinatra
|
2
|
+
|
3
|
+
*ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΡΠΎΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠΌ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ
|
4
|
+
ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΌ*
|
5
|
+
|
6
|
+
Sinatra β ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠ°ΡΠΊΠ°Ρ
|
7
|
+
([DSL](http://ru.wikipedia.org/wiki/ΠΡΠ΅Π΄ΠΌΠ΅ΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ_ΡΠ·ΡΠΊ_ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ))
|
8
|
+
Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ
Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Ruby Ρ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΠΎΠΌ ΡΡΠΈΠ»ΠΈΠΉ:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
# myapp.rb
|
12
|
+
require 'sinatra'
|
13
|
+
|
14
|
+
get '/' do
|
15
|
+
'Hello world!'
|
16
|
+
end
|
17
|
+
```
|
18
|
+
|
19
|
+
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ gem:
|
20
|
+
|
21
|
+
```
|
22
|
+
gem install sinatra
|
23
|
+
```
|
24
|
+
|
25
|
+
ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ:
|
26
|
+
|
27
|
+
```
|
28
|
+
ruby myapp.rb
|
29
|
+
```
|
30
|
+
|
31
|
+
ΠΡΠ΅Π½ΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ: http://localhost:4567
|
32
|
+
|
33
|
+
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Thin, ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ: `gem install
|
34
|
+
thin`. Thin β ΡΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ Π΄Π»Ρ
|
35
|
+
ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Sinatra.
|
36
|
+
|
37
|
+
## ΠΠ°ΡΡΡΡΡΡ
|
38
|
+
|
39
|
+
Π Sinatra ΠΌΠ°ΡΡΡΡΡ β ΡΡΠΎ ΠΏΠ°ΡΠ°: <HTTP ΠΌΠ΅ΡΠΎΠ΄> ΠΈ <ΡΠ°Π±Π»ΠΎΠ½ URL>. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΌΠ°ΡΡΡΡΡ
|
40
|
+
ΡΠ²ΡΠ·Π°Π½ Ρ Π±Π»ΠΎΠΊΠΎΠΌ ΠΊΠΎΠ΄Π°:
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
get '/' do
|
44
|
+
# .. ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ..
|
45
|
+
end
|
46
|
+
|
47
|
+
post '/' do
|
48
|
+
# .. ΡΡΠΎ-ΡΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ..
|
49
|
+
end
|
50
|
+
|
51
|
+
put '/' do
|
52
|
+
# .. ΡΡΠΎ-ΡΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ..
|
53
|
+
end
|
54
|
+
|
55
|
+
patch '/' do
|
56
|
+
# .. ΡΡΠΎ-ΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ..
|
57
|
+
end
|
58
|
+
|
59
|
+
delete '/' do
|
60
|
+
# .. ΡΡΠΎ-ΡΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ..
|
61
|
+
end
|
62
|
+
|
63
|
+
options '/' do
|
64
|
+
# .. ΡΡΠΎ-ΡΠΎ ΠΎΡΠ²Π΅ΡΠΈΡΡ ..
|
65
|
+
end
|
66
|
+
|
67
|
+
link '/' do
|
68
|
+
.. ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ..
|
69
|
+
end
|
70
|
+
|
71
|
+
unlink '/' do
|
72
|
+
.. ΡΡΠΎ-ΡΠΎ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ ..
|
73
|
+
end
|
74
|
+
```
|
75
|
+
|
76
|
+
ΠΠ°ΡΡΡΡΡΡ ΡΠ²Π΅ΡΡΡΡΡΡ Ρ Π·Π°ΠΏΡΠΎΡΠΎΠΌ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΡΡΠΈ ΠΈΡ
Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠ°ΠΉΠ»Π΅
|
77
|
+
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ΅ΡΠ²ΡΠΉ ΠΆΠ΅ ΡΠΎΠ²ΠΏΠ°Π²ΡΠΈΠΉ Ρ Π·Π°ΠΏΡΠΎΡΠΎΠΌ ΠΌΠ°ΡΡΡΡΡ ΠΈ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½.
|
78
|
+
|
79
|
+
Π¨Π°Π±Π»ΠΎΠ½Ρ ΠΌΠ°ΡΡΡΡΡΠΎΠ² ΠΌΠΎΠ³ΡΡ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π² ΡΠ΅Π±Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π² xΡΡΠ΅
|
80
|
+
`params`:
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
get '/hello/:name' do
|
84
|
+
# ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ "GET /hello/foo" ΠΈ "GET /hello/bar",
|
85
|
+
# Π³Π΄Π΅ params[:name] 'foo' ΠΈΠ»ΠΈ 'bar'
|
86
|
+
"Hello #{params[:name]}!"
|
87
|
+
end
|
88
|
+
```
|
89
|
+
|
90
|
+
Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π±Π»ΠΎΠΊΠ°:
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
get '/hello/:name' do |n|
|
94
|
+
"Hello #{n}!"
|
95
|
+
end
|
96
|
+
```
|
97
|
+
|
98
|
+
Π¨Π°Π±Π»ΠΎΠ½Ρ ΠΌΠ°ΡΡΡΡΡΠΎΠ² ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡΡ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π² ΡΠ΅Π±Ρ splat (ΠΈΠ»ΠΈ '*' ΠΌΠ°ΡΠΊΡ,
|
99
|
+
ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡΡΡ Π»ΡΠ±ΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ») ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ `params[:splat]`:
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
get '/say/*/to/*' do
|
103
|
+
# ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ /say/hello/to/world
|
104
|
+
params[:splat] # => ["hello", "world"]
|
105
|
+
end
|
106
|
+
|
107
|
+
get '/download/*.*' do
|
108
|
+
# ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ /download/path/to/file.xml
|
109
|
+
params[:splat] # => ["path/to/file", "xml"]
|
110
|
+
end
|
111
|
+
```
|
112
|
+
|
113
|
+
ΠΠ»ΠΈ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ Π±Π»ΠΎΠΊΠ°:
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
get '/download/*.*' do |path, ext|
|
117
|
+
[path, ext] # => ["path/to/file", "xml"]
|
118
|
+
end
|
119
|
+
```
|
120
|
+
|
121
|
+
Π Π΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΌΠ°ΡΡΡΡΡΠΎΠ²:
|
122
|
+
|
123
|
+
```ruby
|
124
|
+
get %r{/hello/([\w]+)} do
|
125
|
+
"Hello, #{params[:captures].first}!"
|
126
|
+
end
|
127
|
+
```
|
128
|
+
|
129
|
+
ΠΠ»ΠΈ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ Π±Π»ΠΎΠΊΠ°:
|
130
|
+
|
131
|
+
```ruby
|
132
|
+
get %r{/hello/([\w]+)} do |c|
|
133
|
+
"Hello, #{c}!"
|
134
|
+
end
|
135
|
+
```
|
136
|
+
|
137
|
+
Π¨Π°Π±Π»ΠΎΠ½Ρ ΠΌΠ°ΡΡΡΡΡΠΎΠ² ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
|
138
|
+
|
139
|
+
```ruby
|
140
|
+
get '/posts.?:format?' do
|
141
|
+
# ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ "GET /posts", "GET /posts.json", "GET /posts.xml" ΠΈ Ρ.Π΄.
|
142
|
+
end
|
143
|
+
```
|
144
|
+
|
145
|
+
ΠΡΡΠ°ΡΠΈ, Π΅ΡΠ»ΠΈ Π²Ρ Π½Π΅ ΠΎΡΠΊΠ»ΡΡΠΈΡΠ΅ Π·Π°ΡΠΈΡΡ ΠΎΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΡΠΈ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡ
(path
|
146
|
+
traversal, ΡΠΌ. Π½ΠΈΠΆΠ΅), ΠΏΡΡΡ Π·Π°ΠΏΡΠΎΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π΄ΠΎ Π½Π°ΡΠ°Π»Π° ΠΏΠΎΠΈΡΠΊΠ°
|
147
|
+
ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΠΌΠ°ΡΡΡΡΡΠ°.
|
148
|
+
|
149
|
+
### Π£ΡΠ»ΠΎΠ²ΠΈΡ
|
150
|
+
|
151
|
+
ΠΠ°ΡΡΡΡΡΡ ΠΌΠΎΠ³ΡΡ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ΅
|
152
|
+
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (user agent):
|
153
|
+
|
154
|
+
```ruby
|
155
|
+
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
156
|
+
"You're using Songbird version #{params[:agent][0]}"
|
157
|
+
end
|
158
|
+
|
159
|
+
get '/foo' do
|
160
|
+
# ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π½Π΅-songbird Π±ΡΠ°ΡΠ·Π΅ΡΠ°ΠΌ
|
161
|
+
end
|
162
|
+
```
|
163
|
+
|
164
|
+
ΠΡΡΠ³ΠΈΠΌΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌΠΈ ΡΠ²Π»ΡΡΡΡΡ `host_name` ΠΈ `provides`:
|
165
|
+
|
166
|
+
```ruby
|
167
|
+
get '/', :host_name => /^admin\./ do
|
168
|
+
"Admin Area, Access denied!"
|
169
|
+
end
|
170
|
+
|
171
|
+
get '/', :provides => 'html' do
|
172
|
+
haml :index
|
173
|
+
end
|
174
|
+
|
175
|
+
get '/', :provides => ['rss', 'atom', 'xml'] do
|
176
|
+
builder :feed
|
177
|
+
end
|
178
|
+
```
|
179
|
+
|
180
|
+
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°Π΄Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ:
|
181
|
+
|
182
|
+
```ruby
|
183
|
+
set(:probability) { |value| condition { rand <= value } }
|
184
|
+
|
185
|
+
get '/win_a_car', :probability => 0.1 do
|
186
|
+
"You won!"
|
187
|
+
end
|
188
|
+
|
189
|
+
get '/win_a_car' do
|
190
|
+
"Sorry, you lost."
|
191
|
+
end
|
192
|
+
```
|
193
|
+
|
194
|
+
ΠΠ»Ρ ΡΡΠ»ΠΎΠ²ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π·Π²Π΅Π·Π΄ΠΎΡΠΊΡ:
|
195
|
+
|
196
|
+
```ruby
|
197
|
+
set(:auth) do |*roles| # <- ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π·Π²Π΅Π·Π΄ΠΎΡΠΊΡ
|
198
|
+
condition do
|
199
|
+
unless logged_in? && roles.any? {|role| current_user.in_role? role }
|
200
|
+
redirect "/login/", 303
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
get "/my/account/", :auth => [:user, :admin] do
|
206
|
+
"Your Account Details"
|
207
|
+
end
|
208
|
+
|
209
|
+
get "/only/admin/", :auth => :admin do
|
210
|
+
"Only admins are allowed here!"
|
211
|
+
end
|
212
|
+
```
|
213
|
+
|
214
|
+
### ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
|
215
|
+
|
216
|
+
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠ° ΠΌΠ°ΡΡΡΡΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅Π»ΠΎΠΌ ΠΎΡΠ²Π΅ΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅
|
217
|
+
Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ΠΎ HTTP ΠΊΠ»ΠΈΠ΅Π½ΡΡ, ΠΈΠ»ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ "ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΠΎΠΉ" (middleware) Π² Rack
|
218
|
+
ΡΡΠ΅ΠΊΠ΅. Π§Π°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΡΠΎ ΡΡΡΠΎΠΊΠ°, ΠΊΠ°ΠΊ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ
Π²ΡΡΠ΅. ΠΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ ΠΈ
|
219
|
+
Π΄ΡΡΠ³ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
|
220
|
+
|
221
|
+
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²Π΅ΡΠ½ΡΡΡ Π»ΡΠ±ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π»ΠΈΠ±ΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΌ Rack ΠΎΡΠ²Π΅ΡΠΎΠΌ,
|
222
|
+
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ Rack body, Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ΄ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ HTTP:
|
223
|
+
|
224
|
+
* ΠΌΠ°ΡΡΠΈΠ² Ρ ΡΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ: `[ΠΊΠΎΠ΄ (Fixnum), Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ (Hash), ΡΠ΅Π»ΠΎ ΠΎΡΠ²Π΅ΡΠ°
|
225
|
+
(Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° #each)]`;
|
226
|
+
* ΠΌΠ°ΡΡΠΈΠ² Ρ Π΄Π²ΡΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ: `[ΠΊΠΎΠ΄ (Fixnum), ΡΠ΅Π»ΠΎ ΠΎΡΠ²Π΅ΡΠ° (Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΠ²Π΅ΡΠ°ΡΡ
|
227
|
+
Π½Π° #each)]`;
|
228
|
+
* ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠΈΠΉ Π½Π° `#each`, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊΠΎΠ²ΡΠ΅ ΡΠΈΠΏΡ
|
229
|
+
Π΄Π°Π½Π½ΡΡ
Π² ΡΡΠΎΡ Π±Π»ΠΎΠΊ;
|
230
|
+
* Fixnum, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ HTTP.
|
231
|
+
|
232
|
+
|
233
|
+
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΡΠΎΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ:
|
234
|
+
|
235
|
+
```ruby
|
236
|
+
class Stream
|
237
|
+
def each
|
238
|
+
100.times { |i| yield "#{i}\n" }
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
get('/') { Stream.new }
|
243
|
+
```
|
244
|
+
|
245
|
+
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ `stream` (ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΠΉ Π½ΠΈΠΆΠ΅), ΡΡΠΎΠ±Ρ
|
246
|
+
ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄ΡΠ±Π»ΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ Π΄Π΅ΡΠΆΠ°ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΡΡΡΠΈΠΌΠΈΠ½Π³Π° ΠΏΡΡΠΌΠΎ Π²
|
247
|
+
ΠΌΠ°ΡΡΡΡΡΠ΅.
|
248
|
+
|
249
|
+
### Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΡ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠΉ Π΄Π»Ρ ΠΌΠ°ΡΡΡΡΡΠΎΠ²
|
250
|
+
|
251
|
+
ΠΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅, Sinatra ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΡΡΡΠΎΠΊ ΠΈ
|
252
|
+
ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ
Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² URL. ΠΠΎ ΠΈ ΡΡΠΎ Π΅ΡΠ΅ Π½Π΅ Π²ΡΠ΅. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅
|
253
|
+
Π»Π΅Π³ΠΊΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΡ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠΉ (matchers) Π΄Π»Ρ
|
254
|
+
ΠΌΠ°ΡΡΡΡΡΠΎΠ²:
|
255
|
+
|
256
|
+
```ruby
|
257
|
+
class AllButPattern
|
258
|
+
Match = Struct.new(:captures)
|
259
|
+
|
260
|
+
def initialize(except)
|
261
|
+
@except = except
|
262
|
+
@captures = Match.new([])
|
263
|
+
end
|
264
|
+
|
265
|
+
def match(str)
|
266
|
+
@captures unless @except === str
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
def all_but(pattern)
|
271
|
+
AllButPattern.new(pattern)
|
272
|
+
end
|
273
|
+
|
274
|
+
get all_but("/index") do
|
275
|
+
# ...
|
276
|
+
end
|
277
|
+
```
|
278
|
+
|
279
|
+
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ΅ΡΠ΅ΡΡΡΡ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½
|
280
|
+
ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΡΠ°ΠΊ:
|
281
|
+
|
282
|
+
```ruby
|
283
|
+
get // do
|
284
|
+
pass if request.path_info == "/index"
|
285
|
+
# ...
|
286
|
+
end
|
287
|
+
```
|
288
|
+
|
289
|
+
ΠΠ»ΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° Π²ΠΏΠ΅ΡΠ΅Π΄:
|
290
|
+
|
291
|
+
```ruby
|
292
|
+
get %r{^(?!/index$)} do
|
293
|
+
# ...
|
294
|
+
end
|
295
|
+
```
|
296
|
+
|
297
|
+
## Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ
|
298
|
+
|
299
|
+
Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΎΡΠ΄Π°ΡΡΡΡ ΠΈΠ· `./public` Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΡ Π΄ΡΡΠ³ΠΎΠ΅
|
300
|
+
ΠΌΠ΅ΡΡΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠΏΡΠΈΡ `:public_folder`:
|
301
|
+
|
302
|
+
```ruby
|
303
|
+
set :public_folder, File.dirname(__FILE__) + '/static'
|
304
|
+
```
|
305
|
+
|
306
|
+
Π£ΡΡΠΈΡΠ΅, ΡΡΠΎ ΠΈΠΌΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΡΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ Π½Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ Π² URL.
|
307
|
+
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΉΠ» `./public/css/style.css` Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΊΠ°ΠΊ
|
308
|
+
`http://example.com/css/style.css`.
|
309
|
+
|
310
|
+
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΎΠΏΡΠΈΡ `:static_cache_control` (ΡΠΌ. Π½ΠΈΠΆΠ΅), ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ
|
311
|
+
`Cache-Control`.
|
312
|
+
|
313
|
+
## ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ / Π¨Π°Π±Π»ΠΎΠ½Ρ
|
314
|
+
|
315
|
+
ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ ΡΠ²ΠΎΠΈΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ. ΠΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΏΠΎΠΏΡΠΎΡΡΡ
|
316
|
+
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΡΡΠΎΠΊΡ:
|
317
|
+
|
318
|
+
```ruby
|
319
|
+
get '/' do
|
320
|
+
erb :index
|
321
|
+
end
|
322
|
+
```
|
323
|
+
|
324
|
+
ΠΡΠΎΠ±ΡΠ°Π·ΠΈΡ `views/index.erb`.
|
325
|
+
|
326
|
+
ΠΠΌΠ΅ΡΡΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°Π±Π»ΠΎΠ½Π° Π²Ρ ΡΠ°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ°ΠΌΠΎ
|
327
|
+
ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π°:
|
328
|
+
|
329
|
+
```ruby
|
330
|
+
get '/' do
|
331
|
+
code = "<%= Time.now %>"
|
332
|
+
erb code
|
333
|
+
end
|
334
|
+
```
|
335
|
+
|
336
|
+
ΠΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, Ρ
Π΅Ρ Ρ ΠΎΠΏΡΠΈΡΠΌΠΈ:
|
337
|
+
|
338
|
+
```ruby
|
339
|
+
get '/' do
|
340
|
+
erb :index, :layout => :post
|
341
|
+
end
|
342
|
+
```
|
343
|
+
|
344
|
+
ΠΡΠΎΠ±ΡΠ°Π·ΠΈΡ `views/index.erb`, Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌ Π² `views/post.erb` (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ:
|
345
|
+
`views/layout.erb`, Π΅ΡΠ»ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ).
|
346
|
+
|
347
|
+
ΠΡΠ±ΡΠ΅ ΠΎΠΏΡΠΈΠΈ, Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌΡΠ΅ Sinatra, Π±ΡΠ΄ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Ρ Π² ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ:
|
348
|
+
|
349
|
+
```ruby
|
350
|
+
get '/' do
|
351
|
+
haml :index, :format => :html5
|
352
|
+
end
|
353
|
+
```
|
354
|
+
|
355
|
+
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°Π΄Π°Π²Π°ΡΡ ΠΎΠΏΡΠΈΠΈ Π΄Π»Ρ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΠΎΠ² Π² ΠΎΠ±ΡΠ΅ΠΌ:
|
356
|
+
|
357
|
+
```ruby
|
358
|
+
set :haml, :format => :html5
|
359
|
+
|
360
|
+
get '/' do
|
361
|
+
haml :index
|
362
|
+
end
|
363
|
+
```
|
364
|
+
|
365
|
+
ΠΠΏΡΠΈΠΈ, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠ΅ Π² ΠΌΠ΅ΡΠΎΠ΄, ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΎΠΏΡΠΈΠΈ, Π·Π°Π΄Π°Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ `set`.
|
366
|
+
|
367
|
+
ΠΠΎΡΡΡΠΏΠ½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ:
|
368
|
+
|
369
|
+
<dl>
|
370
|
+
<dt>locals</dt>
|
371
|
+
<dd>
|
372
|
+
Π‘ΠΏΠΈΡΠΎΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΡ
Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ.
|
373
|
+
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ: <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>
|
374
|
+
</dd>
|
375
|
+
|
376
|
+
<dt>default_encoding</dt>
|
377
|
+
<dd>
|
378
|
+
ΠΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ°, ΠΊΠΎΡΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, Π΅ΡΠ»ΠΈ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ
|
379
|
+
ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΡ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: <tt>settings.default_encoding</tt>.
|
380
|
+
</dd>
|
381
|
+
|
382
|
+
<dt>views</dt>
|
383
|
+
<dd>
|
384
|
+
ΠΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Ρ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌΠΈ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: <tt>settings.views</tt>.
|
385
|
+
</dd>
|
386
|
+
|
387
|
+
<dt>layout</dt>
|
388
|
+
<dd>
|
389
|
+
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ Π½Π΅Ρ Π»ΡΠΉΠ°ΡΡ (<tt>true</tt> ΠΈΠ»ΠΈ <tt>false</tt>). ΠΡΠ»ΠΈ ΠΆΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Symbol,
|
390
|
+
ΡΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊΠΎΠΉ ΡΠ°Π±Π»ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π»ΡΠΉΠ°ΡΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
|
391
|
+
<tt>erb :index, :layout => !request.xhr?</tt>
|
392
|
+
</dd>
|
393
|
+
|
394
|
+
<dt>content_type</dt>
|
395
|
+
<dd>
|
396
|
+
Content-Type ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π°. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: Π·Π°Π΄Π°Π΅ΡΡΡ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΠΎΠΌ.
|
397
|
+
</dd>
|
398
|
+
|
399
|
+
<dt>scope</dt>
|
400
|
+
<dd>
|
401
|
+
ΠΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ΅Π½Π΄Π΅ΡΡΡΡΡ ΡΠ°Π±Π»ΠΎΠ½Ρ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ
|
402
|
+
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠ»ΠΈ Π²Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΡΡΡ ΠΎΠΏΡΠΈΡ, ΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΈ
|
403
|
+
ΠΌΠ΅ΡΠΎΠ΄Ρ-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠΈ ΡΡΠ°Π½ΡΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ Π² Π²Π°ΡΠΈΡ
ΡΠ°Π±Π»ΠΎΠ½Π°Ρ
.
|
404
|
+
</dd>
|
405
|
+
|
406
|
+
<dt>layout_engine</dt>
|
407
|
+
<dd>
|
408
|
+
Π¨Π°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π»ΡΠΉΠ°ΡΡΠ°.
|
409
|
+
ΠΠΎΠ»Π΅Π·Π½Π°Ρ ΠΎΠΏΡΠΈΡ Π΄Π»Ρ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ
Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ
|
410
|
+
Π»ΡΠΉΠ°ΡΡΠΎΠ². ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: ΡΠΎΡ ΠΆΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈ Π΄Π»Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ
|
411
|
+
ΡΠ°Π±Π»ΠΎΠ½Π°. ΠΡΠΈΠΌΠ΅Ρ: <tt>set :rdoc, :layout_engine => :erb</tt>
|
412
|
+
</dd>
|
413
|
+
</dl>
|
414
|
+
|
415
|
+
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΡΠΈΡΠ°Π΅ΡΡΡ, ΡΡΠΎ ΡΠ°Π±Π»ΠΎΠ½Ρ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ `./views`. Π§ΡΠΎΠ±Ρ
|
416
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Ρ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌΠΈ:
|
417
|
+
|
418
|
+
```ruby
|
419
|
+
set :views, settings.root + '/templates'
|
420
|
+
```
|
421
|
+
|
422
|
+
ΠΠ°ΠΆΠ½ΠΎΠ΅ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: Π²Ρ Π²ΡΠ΅Π³Π΄Π° Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΡΠ°Π±Π»ΠΎΠ½Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²
|
423
|
+
(Symbol), Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π² ΠΏΠΎΠ΄Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ (Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅
|
424
|
+
`:'subdir/template'`). ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΈΠ½Π°ΡΠ΅
|
425
|
+
ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΡ ΠΏΠΎΠΏΡΠΎΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ Π»ΡΠ±ΡΠ΅ ΡΡΡΠΎΠΊΠΈ, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠ΅ ΠΈΠΌ.
|
426
|
+
|
427
|
+
### ΠΡΠΊΠ²Π°Π»ΡΠ½ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Ρ
|
428
|
+
|
429
|
+
```ruby
|
430
|
+
get '/' do
|
431
|
+
haml '%div.title Hello World'
|
432
|
+
end
|
433
|
+
```
|
434
|
+
|
435
|
+
ΠΡΠΎΠ±ΡΠ°Π·ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΉ ΡΡΡΠΎΠΊΠΎΠΉ.
|
436
|
+
|
437
|
+
### ΠΠΎΡΡΡΠΏΠ½ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΡ
|
438
|
+
|
439
|
+
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ·ΡΠΊΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ. Π§ΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊΡΡ
|
440
|
+
ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, Π²Π°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Π½ΡΠΆΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ:
|
441
|
+
|
442
|
+
```ruby
|
443
|
+
require 'rdiscount' # ΠΈΠ»ΠΈ require 'bluecloth'
|
444
|
+
get('/') { markdown :index }
|
445
|
+
```
|
446
|
+
|
447
|
+
#### Haml ΡΠ°Π±Π»ΠΎΠ½Ρ
|
448
|
+
|
449
|
+
<table>
|
450
|
+
<tr>
|
451
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
452
|
+
<td><a href="http://haml.info/" title="haml">haml</a></td>
|
453
|
+
</tr>
|
454
|
+
<tr>
|
455
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
456
|
+
<td><tt>.haml</tt></td>
|
457
|
+
</tr>
|
458
|
+
<tr>
|
459
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
460
|
+
<td><tt>haml :index, :format => :html5</tt></td>
|
461
|
+
</tr>
|
462
|
+
</table>
|
463
|
+
|
464
|
+
#### Erb ΡΠ°Π±Π»ΠΎΠ½Ρ
|
465
|
+
|
466
|
+
<table>
|
467
|
+
<tr>
|
468
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
469
|
+
<td>
|
470
|
+
<a href="http://www.kuwata-lab.com/erubis/" title="erubis">erubis</a>
|
471
|
+
ΠΈΠ»ΠΈ erb (Π²ΠΊΠ»ΡΡΠ΅Π½ Π² Ruby)
|
472
|
+
</td>
|
473
|
+
</tr>
|
474
|
+
<tr>
|
475
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
476
|
+
<td><tt>.erb</tt>, <tt>.rhtml</tt> or <tt>.erubis</tt> (ΡΠΎΠ»ΡΠΊΠΎ Erubis)</td>
|
477
|
+
</tr>
|
478
|
+
<tr>
|
479
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
480
|
+
<td><tt>erb :index</tt></td>
|
481
|
+
</tr>
|
482
|
+
</table>
|
483
|
+
|
484
|
+
#### Builder ΡΠ°Π±Π»ΠΎΠ½Ρ
|
485
|
+
|
486
|
+
<table>
|
487
|
+
<tr>
|
488
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
489
|
+
<td>
|
490
|
+
<a href="http://builder.rubyforge.org/" title="builder">builder</a>
|
491
|
+
</td>
|
492
|
+
</tr>
|
493
|
+
<tr>
|
494
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
495
|
+
<td><tt>.builder</tt></td>
|
496
|
+
</tr>
|
497
|
+
<tr>
|
498
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
499
|
+
<td><tt>builder { |xml| xml.em "hi" }</tt></td>
|
500
|
+
</tr>
|
501
|
+
</table>
|
502
|
+
|
503
|
+
ΠΠ»ΠΎΠΊ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈ Π΄Π»Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ
ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² (ΡΠΌ. ΠΏΡΠΈΠΌΠ΅Ρ).
|
504
|
+
|
505
|
+
#### Nokogiri ΡΠ°Π±Π»ΠΎΠ½Ρ
|
506
|
+
|
507
|
+
<table>
|
508
|
+
<tr>
|
509
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
510
|
+
<td><a href="http://nokogiri.org/" title="nokogiri">nokogiri</a></td>
|
511
|
+
</tr>
|
512
|
+
<tr>
|
513
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
514
|
+
<td><tt>.nokogiri</tt></td>
|
515
|
+
</tr>
|
516
|
+
<tr>
|
517
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
518
|
+
<td><tt>nokogiri { |xml| xml.em "hi" }</tt></td>
|
519
|
+
</tr>
|
520
|
+
</table>
|
521
|
+
|
522
|
+
ΠΠ»ΠΎΠΊ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈ Π΄Π»Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ
ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² (ΡΠΌ. ΠΏΡΠΈΠΌΠ΅Ρ).
|
523
|
+
|
524
|
+
#### Sass ΡΠ°Π±Π»ΠΎΠ½Ρ
|
525
|
+
|
526
|
+
<table>
|
527
|
+
<tr>
|
528
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
529
|
+
<td><a href="http://sass-lang.com/" title="sass">sass</a></td>
|
530
|
+
</tr>
|
531
|
+
<tr>
|
532
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
533
|
+
<td><tt>.sass</tt></td>
|
534
|
+
</tr>
|
535
|
+
<tr>
|
536
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
537
|
+
<td><tt>sass :stylesheet, :style => :expanded</tt></td>
|
538
|
+
</tr>
|
539
|
+
</table>
|
540
|
+
|
541
|
+
#### SCSS ΡΠ°Π±Π»ΠΎΠ½Ρ
|
542
|
+
|
543
|
+
<table>
|
544
|
+
<tr>
|
545
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
546
|
+
<td><a href="http://sass-lang.com/" title="sass">sass</a></td>
|
547
|
+
</tr>
|
548
|
+
<tr>
|
549
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
550
|
+
<td><tt>.scss</tt></td>
|
551
|
+
</tr>
|
552
|
+
<tr>
|
553
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
554
|
+
<td><tt>scss :stylesheet, :style => :expanded</tt></td>
|
555
|
+
</tr>
|
556
|
+
</table>
|
557
|
+
|
558
|
+
#### Less ΡΠ°Π±Π»ΠΎΠ½Ρ
|
559
|
+
|
560
|
+
<table>
|
561
|
+
<tr>
|
562
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
563
|
+
<td><a href="http://www.lesscss.org/" title="less">less</a></td>
|
564
|
+
</tr>
|
565
|
+
<tr>
|
566
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
567
|
+
<td><tt>.less</tt></td>
|
568
|
+
</tr>
|
569
|
+
<tr>
|
570
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
571
|
+
<td><tt>less :stylesheet</tt></td>
|
572
|
+
</tr>
|
573
|
+
</table>
|
574
|
+
|
575
|
+
#### Liquid ΡΠ°Π±Π»ΠΎΠ½Ρ
|
576
|
+
|
577
|
+
<table>
|
578
|
+
<tr>
|
579
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
580
|
+
<td><a href="http://www.liquidmarkup.org/" title="liquid">liquid</a></td>
|
581
|
+
</tr>
|
582
|
+
<tr>
|
583
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
584
|
+
<td><tt>.liquid</tt></td>
|
585
|
+
</tr>
|
586
|
+
<tr>
|
587
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
588
|
+
<td><tt>liquid :index, :locals => { :key => 'value' }</tt></td>
|
589
|
+
</tr>
|
590
|
+
</table>
|
591
|
+
|
592
|
+
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² Liquid ΡΠ°Π±Π»ΠΎΠ½Π°Ρ
Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ· Ruby (ΠΊΡΠΎΠΌΠ΅ `yield`), ΡΠΎ
|
593
|
+
Π²Ρ ΠΏΠΎΡΡΠΈ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π² ΡΠ°Π±Π»ΠΎΠ½ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅.
|
594
|
+
|
595
|
+
#### Markdown ΡΠ°Π±Π»ΠΎΠ½Ρ
|
596
|
+
|
597
|
+
<table>
|
598
|
+
<tr>
|
599
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
600
|
+
<td>
|
601
|
+
ΠΡΠ±Π°Ρ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ:
|
602
|
+
<a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
|
603
|
+
<a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
|
604
|
+
<a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
|
605
|
+
<a href="http://kramdown.rubyforge.org/" title="kramdown">kramdown</a>,
|
606
|
+
<a href="http://maruku.rubyforge.org/" title="maruku">maruku</a>
|
607
|
+
</td>
|
608
|
+
</tr>
|
609
|
+
<tr>
|
610
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
611
|
+
<td><tt>.markdown</tt>, <tt>.mkd</tt> and <tt>.md</tt></td>
|
612
|
+
</tr>
|
613
|
+
<tr>
|
614
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
615
|
+
<td><tt>markdown :index, :layout_engine => :erb</tt></td>
|
616
|
+
</tr>
|
617
|
+
</table>
|
618
|
+
|
619
|
+
Π Markdown Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅.
|
620
|
+
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π²Π°ΠΌ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠ°Π±Π»ΠΎΠ½ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ
|
621
|
+
Ρ Π΄ΡΡΠ³ΠΈΠΌ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΠΎΠΌ:
|
622
|
+
|
623
|
+
```ruby
|
624
|
+
erb :overview, :locals => { :text => markdown(:introduction) }
|
625
|
+
```
|
626
|
+
|
627
|
+
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ `markdown` ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ
ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ²:
|
628
|
+
|
629
|
+
```ruby
|
630
|
+
%h1 Hello From Haml!
|
631
|
+
%p= markdown(:greetings)
|
632
|
+
```
|
633
|
+
|
634
|
+
ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ Ruby ΠΈΠ· Markdown, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅
|
635
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠΉΠ°ΡΡΡ Π½Π° Markdown. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
|
636
|
+
ΠΎΠ΄ΠΈΠ½ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π°, Π° Π΄ΡΡΠ³ΠΎΠΉ Π΄Π»Ρ Π»ΡΠΉΠ°ΡΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ
|
637
|
+
ΠΎΠΏΡΠΈΠΈ `:layout_engine`.
|
638
|
+
|
639
|
+
#### Textile ΡΠ°Π±Π»ΠΎΠ½Ρ
|
640
|
+
|
641
|
+
<table>
|
642
|
+
<tr>
|
643
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
644
|
+
<td><a href="http://redcloth.org/" title="RedCloth">RedCloth</a></td>
|
645
|
+
</tr>
|
646
|
+
<tr>
|
647
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
648
|
+
<td><tt>.textile</tt></td>
|
649
|
+
</tr>
|
650
|
+
<tr>
|
651
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
652
|
+
<td><tt>textile :index, :layout_engine => :erb</tt></td>
|
653
|
+
</tr>
|
654
|
+
</table>
|
655
|
+
|
656
|
+
Π Textile Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅.
|
657
|
+
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π²Π°ΠΌ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠ°Π±Π»ΠΎΠ½ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ
|
658
|
+
Ρ Π΄ΡΡΠ³ΠΈΠΌ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΠΎΠΌ:
|
659
|
+
|
660
|
+
```ruby
|
661
|
+
erb :overview, :locals => { :text => textile(:introduction) }
|
662
|
+
```
|
663
|
+
|
664
|
+
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ `textile` ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ
ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ²:
|
665
|
+
|
666
|
+
```ruby
|
667
|
+
%h1 Hello From Haml!
|
668
|
+
%p= textile(:greetings)
|
669
|
+
```
|
670
|
+
|
671
|
+
ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ Ruby ΠΈΠ· Textile, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅
|
672
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠΉΠ°ΡΡΡ Π½Π° Textile. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
|
673
|
+
ΠΎΠ΄ΠΈΠ½ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π°, Π° Π΄ΡΡΠ³ΠΎΠΉ Π΄Π»Ρ Π»ΡΠΉΠ°ΡΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ
|
674
|
+
ΠΎΠΏΡΠΈΠΈ `:layout_engine`.
|
675
|
+
|
676
|
+
#### RDoc ΡΠ°Π±Π»ΠΎΠ½Ρ
|
677
|
+
|
678
|
+
<table>
|
679
|
+
<tr>
|
680
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
681
|
+
<td><a href="http://rdoc.rubyforge.org/" title="RDoc">RDoc</a></td>
|
682
|
+
</tr>
|
683
|
+
<tr>
|
684
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
685
|
+
<td><tt>.rdoc</tt></td>
|
686
|
+
</tr>
|
687
|
+
<tr>
|
688
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
689
|
+
<td><tt>rdoc :README, :layout_engine => :erb</tt></td>
|
690
|
+
</tr>
|
691
|
+
</table>
|
692
|
+
|
693
|
+
Π RDoc Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅.
|
694
|
+
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π²Π°ΠΌ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠ°Π±Π»ΠΎΠ½ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ
|
695
|
+
Ρ Π΄ΡΡΠ³ΠΈΠΌ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΠΎΠΌ:
|
696
|
+
|
697
|
+
```ruby
|
698
|
+
erb :overview, :locals => { :text => rdoc(:introduction) }
|
699
|
+
```
|
700
|
+
|
701
|
+
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ `rdoc` ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ
ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ²:
|
702
|
+
|
703
|
+
```ruby
|
704
|
+
%h1 Hello From Haml!
|
705
|
+
%p= rdoc(:greetings)
|
706
|
+
```
|
707
|
+
|
708
|
+
ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ Ruby ΠΈΠ· RDoc, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
|
709
|
+
Π»ΡΠΉΠ°ΡΡΡ Π½Π° RDoc. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ
|
710
|
+
Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π°, Π° Π΄ΡΡΠ³ΠΎΠΉ Π΄Π»Ρ Π»ΡΠΉΠ°ΡΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΡΠΈΠΈ
|
711
|
+
`:layout_engine`.
|
712
|
+
|
713
|
+
#### AsciiDoc ΡΠ°Π±Π»ΠΎΠ½Ρ
|
714
|
+
|
715
|
+
<table>
|
716
|
+
<tr>
|
717
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
718
|
+
<td><a href="http://asciidoctor.org/" title="Asciidoctor">Asciidoctor</a></td>
|
719
|
+
</tr>
|
720
|
+
<tr>
|
721
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
722
|
+
<td><tt>.asciidoc</tt>, <tt>.adoc</tt> ΠΈ <tt>.ad</tt></td>
|
723
|
+
</tr>
|
724
|
+
<tr>
|
725
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
726
|
+
<td><tt>asciidoc :README, :layout_engine => :erb</tt></td>
|
727
|
+
</tr>
|
728
|
+
</table>
|
729
|
+
|
730
|
+
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² AsciiDoc ΡΠ°Π±Π»ΠΎΠ½Π°Ρ
Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ· Ruby Π½Π°ΠΏΡΡΠΌΡΡ, ΡΠΎ Π²Ρ
|
731
|
+
ΠΏΠΎΡΡΠΈ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π² ΡΠ°Π±Π»ΠΎΠ½ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅.
|
732
|
+
|
733
|
+
#### Radius ΡΠ°Π±Π»ΠΎΠ½Ρ
|
734
|
+
|
735
|
+
<table>
|
736
|
+
<tr>
|
737
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
738
|
+
<td><a href="http://radius.rubyforge.org/" title="Radius">Radius</a></td>
|
739
|
+
</tr>
|
740
|
+
<tr>
|
741
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
742
|
+
<td><tt>.radius</tt></td>
|
743
|
+
</tr>
|
744
|
+
<tr>
|
745
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
746
|
+
<td><tt>radius :index, :locals => { :key => 'value' }</tt></td>
|
747
|
+
</tr>
|
748
|
+
</table>
|
749
|
+
|
750
|
+
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² Radius ΡΠ°Π±Π»ΠΎΠ½Π°Ρ
Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ· Ruby Π½Π°ΠΏΡΡΠΌΡΡ, ΡΠΎ Π²Ρ
|
751
|
+
ΠΏΠΎΡΡΠΈ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π² ΡΠ°Π±Π»ΠΎΠ½ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅.
|
752
|
+
|
753
|
+
#### Markaby ΡΠ°Π±Π»ΠΎΠ½Ρ
|
754
|
+
|
755
|
+
<table>
|
756
|
+
<tr>
|
757
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
758
|
+
<td><a href="http://markaby.github.com/" title="Markaby">Markaby</a></td>
|
759
|
+
</tr>
|
760
|
+
<tr>
|
761
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
762
|
+
<td><tt>.mab</tt></td>
|
763
|
+
</tr>
|
764
|
+
<tr>
|
765
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
766
|
+
<td><tt>markaby { h1 "Welcome!" }</tt></td>
|
767
|
+
</tr>
|
768
|
+
</table>
|
769
|
+
|
770
|
+
ΠΠ»ΠΎΠΊ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈ Π΄Π»Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ
ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² (ΡΠΌ. ΠΏΡΠΈΠΌΠ΅Ρ).
|
771
|
+
|
772
|
+
#### RABL ΡΠ°Π±Π»ΠΎΠ½Ρ
|
773
|
+
|
774
|
+
<table>
|
775
|
+
<tr>
|
776
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
777
|
+
<td><a href="https://github.com/nesquena/rabl" title="Rabl">Rabl</a></td>
|
778
|
+
</tr>
|
779
|
+
<tr>
|
780
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
781
|
+
<td><tt>.rabl</tt></td>
|
782
|
+
</tr>
|
783
|
+
<tr>
|
784
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
785
|
+
<td><tt>rabl :index</tt></td>
|
786
|
+
</tr>
|
787
|
+
</table>
|
788
|
+
|
789
|
+
#### Slim ΡΠ°Π±Π»ΠΎΠ½Ρ
|
790
|
+
|
791
|
+
<table>
|
792
|
+
<tr>
|
793
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
794
|
+
<td><a href="http://slim-lang.com/" title="Slim Lang">Slim Lang</a></td>
|
795
|
+
</tr>
|
796
|
+
<tr>
|
797
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
798
|
+
<td><tt>.slim</tt></td>
|
799
|
+
</tr>
|
800
|
+
<tr>
|
801
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
802
|
+
<td><tt>slim :index</tt></td>
|
803
|
+
</tr>
|
804
|
+
</table>
|
805
|
+
|
806
|
+
#### Creole ΡΠ°Π±Π»ΠΎΠ½Ρ
|
807
|
+
|
808
|
+
<table>
|
809
|
+
<tr>
|
810
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
811
|
+
<td><a href="https://github.com/minad/creole" title="Creole">Creole</a></td>
|
812
|
+
</tr>
|
813
|
+
<tr>
|
814
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
815
|
+
<td><tt>.creole</tt></td>
|
816
|
+
</tr>
|
817
|
+
<tr>
|
818
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
819
|
+
<td><tt>creole :wiki, :layout_engine => :erb</tt></td>
|
820
|
+
</tr>
|
821
|
+
</table>
|
822
|
+
|
823
|
+
Π Creole Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅.
|
824
|
+
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π²Π°ΠΌ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠ°Π±Π»ΠΎΠ½ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ
|
825
|
+
Ρ Π΄ΡΡΠ³ΠΈΠΌ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΠΎΠΌ:
|
826
|
+
|
827
|
+
```ruby
|
828
|
+
erb :overview, :locals => { :text => creole(:introduction) }
|
829
|
+
```
|
830
|
+
|
831
|
+
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ `creole` ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ
ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ²:
|
832
|
+
|
833
|
+
```ruby
|
834
|
+
%h1 Hello From Haml!
|
835
|
+
%p= creole(:greetings)
|
836
|
+
```
|
837
|
+
|
838
|
+
ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ Ruby ΠΈΠ· Creole, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅
|
839
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠΉΠ°ΡΡΡ Π½Π° Creole. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
|
840
|
+
ΠΎΠ΄ΠΈΠ½ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π°, Π° Π΄ΡΡΠ³ΠΎΠΉ Π΄Π»Ρ Π»ΡΠΉΠ°ΡΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ
|
841
|
+
ΠΎΠΏΡΠΈΠΈ `:layout_engine`.
|
842
|
+
|
843
|
+
#### MediaWiki ΡΠ°Π±Π»ΠΎΠ½Ρ
|
844
|
+
|
845
|
+
<table>
|
846
|
+
<tr>
|
847
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
848
|
+
<td><a href="https://github.com/nricciar/wikicloth" title="WikiCloth">WikiCloth</a></td>
|
849
|
+
</tr>
|
850
|
+
<tr>
|
851
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
852
|
+
<td><tt>.mediawiki</tt> ΠΈ <tt>.mw</tt></td>
|
853
|
+
</tr>
|
854
|
+
<tr>
|
855
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
856
|
+
<td><tt>mediawiki :wiki, :layout_engine => :erb</tt></td>
|
857
|
+
</tr>
|
858
|
+
</table>
|
859
|
+
|
860
|
+
Π ΡΠ°Π·ΠΌΠ΅ΡΠΊΠ΅ MediaWiki Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅.
|
861
|
+
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π²Π°ΠΌ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠ°Π±Π»ΠΎΠ½ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ
|
862
|
+
Ρ Π΄ΡΡΠ³ΠΈΠΌ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΠΎΠΌ:
|
863
|
+
|
864
|
+
```ruby
|
865
|
+
erb :overview, :locals => { :text => mediawiki(:introduction) }
|
866
|
+
```
|
867
|
+
|
868
|
+
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ `mediawiki` ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ
ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ²:
|
869
|
+
|
870
|
+
```ruby
|
871
|
+
%h1 Hello From Haml!
|
872
|
+
%p= mediawiki(:greetings)
|
873
|
+
```
|
874
|
+
|
875
|
+
ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ Ruby ΠΈΠ· MediaWiki, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅
|
876
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠΉΠ°ΡΡΡ Π½Π° MediaWiki. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
|
877
|
+
ΠΎΠ΄ΠΈΠ½ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π°, Π° Π΄ΡΡΠ³ΠΎΠΉ Π΄Π»Ρ Π»ΡΠΉΠ°ΡΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ
|
878
|
+
ΠΎΠΏΡΠΈΠΈ `:layout_engine`.
|
879
|
+
|
880
|
+
#### CoffeeScript ΡΠ°Π±Π»ΠΎΠ½Ρ
|
881
|
+
|
882
|
+
<table>
|
883
|
+
<tr>
|
884
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
885
|
+
<td>
|
886
|
+
<a href="https://github.com/josh/ruby-coffee-script" title="Ruby CoffeeScript">
|
887
|
+
CoffeeScript
|
888
|
+
</a> ΠΈ ΡΠΏΠΎΡΠΎΠ±
|
889
|
+
<a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
|
890
|
+
Π·Π°ΠΏΡΡΠΊΠ°ΡΡ JavaScript
|
891
|
+
</a>
|
892
|
+
</td>
|
893
|
+
</tr>
|
894
|
+
<tr>
|
895
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
896
|
+
<td><tt>.coffee</tt></td>
|
897
|
+
</tr>
|
898
|
+
<tr>
|
899
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
900
|
+
<td><tt>coffee :index</tt></td>
|
901
|
+
</tr>
|
902
|
+
</table>
|
903
|
+
|
904
|
+
#### Yajl ΡΠ°Π±Π»ΠΎΠ½Ρ
|
905
|
+
|
906
|
+
<table>
|
907
|
+
<tr>
|
908
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
909
|
+
<td><a href="https://github.com/brianmario/yajl-ruby" title="yajl-ruby">yajl-ruby</a></td>
|
910
|
+
</tr>
|
911
|
+
<tr>
|
912
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
913
|
+
<td><tt>.yajl</tt></td>
|
914
|
+
</tr>
|
915
|
+
<tr>
|
916
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
917
|
+
<td>
|
918
|
+
<tt>
|
919
|
+
yajl :index,
|
920
|
+
:locals => { :key => 'qux' },
|
921
|
+
:callback => 'present',
|
922
|
+
:variable => 'resource'
|
923
|
+
</tt>
|
924
|
+
</td>
|
925
|
+
</tr>
|
926
|
+
</table>
|
927
|
+
|
928
|
+
Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ Π½Π° Ruby, Π° ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ°Ρ
|
929
|
+
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ json Π·Π°ΡΠ΅ΠΌ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ `#to_json`.
|
930
|
+
|
931
|
+
```ruby
|
932
|
+
json = { :foo => 'bar' }
|
933
|
+
json[:baz] = key
|
934
|
+
```
|
935
|
+
|
936
|
+
ΠΠΏΡΠΈΠΈ `:callback` ΠΈ `:variable` ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ "Π΄Π΅ΠΊΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ" ΠΈΡΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ
|
937
|
+
ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
|
938
|
+
|
939
|
+
```ruby
|
940
|
+
var resource = {"foo":"bar","baz":"qux"}; present(resource);
|
941
|
+
```
|
942
|
+
|
943
|
+
#### WLang ΡΠ°Π±Π»ΠΎΠ½Ρ
|
944
|
+
|
945
|
+
<table>
|
946
|
+
<tr>
|
947
|
+
<td>ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ</td>
|
948
|
+
<td><a href="https://github.com/blambeau/wlang/" title="wlang">wlang</a></td>
|
949
|
+
</tr>
|
950
|
+
<tr>
|
951
|
+
<td>Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²</td>
|
952
|
+
<td><tt>.wlang</tt></td>
|
953
|
+
</tr>
|
954
|
+
<tr>
|
955
|
+
<td>ΠΡΠΈΠΌΠ΅Ρ</td>
|
956
|
+
<td><tt>wlang :index, :locals => { :key => 'value' }</tt></td>
|
957
|
+
</tr>
|
958
|
+
</table>
|
959
|
+
|
960
|
+
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² WLang ΡΠ°Π±Π»ΠΎΠ½Π°Ρ
Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ· Ruby Π½Π°ΠΏΡΡΠΌΡΡ (Π·Π°
|
961
|
+
ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ `yield`), ΡΠΎ Π²Ρ ΠΏΠΎΡΡΠΈ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π² ΡΠ°Π±Π»ΠΎΠ½ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅
|
962
|
+
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅.
|
963
|
+
|
964
|
+
### ΠΠΎΡΡΡΠΏ ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ Π² ΡΠ°Π±Π»ΠΎΠ½Π°Ρ
|
965
|
+
|
966
|
+
Π¨Π°Π±Π»ΠΎΠ½Ρ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΡΡΡΡ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅, ΡΡΠΎ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΌΠ°ΡΡΡΡΡΠΎΠ².
|
967
|
+
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΌΠ°ΡΡΡΡΡΠΎΠ², Π±ΡΠ΄ΡΡ
|
968
|
+
Π΄ΠΎΡΡΡΠΏΠ½Ρ Π½Π°ΠΏΡΡΠΌΡΡ Π² ΡΠ°Π±Π»ΠΎΠ½Π°Ρ
:
|
969
|
+
|
970
|
+
```ruby
|
971
|
+
get '/:id' do
|
972
|
+
@foo = Foo.find(params[:id])
|
973
|
+
haml '%h1= @foo.name'
|
974
|
+
end
|
975
|
+
```
|
976
|
+
|
977
|
+
ΠΠΈΠ±ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΠΈΡ
ΡΠ΅ΡΠ΅Π· Ρ
Π΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
:
|
978
|
+
|
979
|
+
```ruby
|
980
|
+
get '/:id' do
|
981
|
+
foo = Foo.find(params[:id])
|
982
|
+
haml '%h1= bar.name', :locals => { :bar => foo }
|
983
|
+
end
|
984
|
+
```
|
985
|
+
|
986
|
+
ΠΡΠΎ ΠΎΠ±ΡΡΠ½ΡΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄, ΠΊΠΎΠ³Π΄Π° ΡΠ°Π±Π»ΠΎΠ½Ρ ΡΠ΅Π½Π΄Π΅ΡΡΡΡΡ ΠΊΠ°ΠΊ ΡΠ°ΡΡΠΈ Π΄ΡΡΠ³ΠΈΡ
ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ².
|
987
|
+
|
988
|
+
### Π¨Π°Π±Π»ΠΎΠ½Ρ Ρ `yield` ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΡΠ°ΡΠΊΠ»Π°Π΄ΠΊΠΈ (layout)
|
989
|
+
|
990
|
+
Π Π°ΡΠΊΠ»Π°Π΄ΠΊΠ° (layout) ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠ°Π±Π»ΠΎΠ½, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅Ρ
|
991
|
+
`yield`.
|
992
|
+
Π’Π°ΠΊΠΎΠΉ ΡΠ°Π±Π»ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΡΠΈΠΈ `:template`,
|
993
|
+
ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π²ΡΡΠ΅, Π»ΠΈΠ±ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ Π±Π»ΠΎΠΊΠΎΠΌ:
|
994
|
+
|
995
|
+
```ruby
|
996
|
+
erb :post, :layout => false do
|
997
|
+
erb :index
|
998
|
+
end
|
999
|
+
```
|
1000
|
+
|
1001
|
+
ΠΡΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½Ρ `erb :index, :layout => :post`.
|
1002
|
+
|
1003
|
+
ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° Π±Π»ΠΎΠΊΠΎΠ² ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΡΡΠΈΠΌ ΡΠ°Π±Π»ΠΎΠ½Ρ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Π° Π΄Π»Ρ
|
1004
|
+
ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ
ΡΠ°ΡΠΊΠ»Π°Π΄ΠΎΠΊ:
|
1005
|
+
|
1006
|
+
```ruby
|
1007
|
+
erb :main_layout, :layout => false do
|
1008
|
+
erb :admin_layout do
|
1009
|
+
erb :user
|
1010
|
+
end
|
1011
|
+
end
|
1012
|
+
```
|
1013
|
+
|
1014
|
+
ΠΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΠΊΠΎΡΠΎΡΠ΅:
|
1015
|
+
|
1016
|
+
```ruby
|
1017
|
+
erb :admin_layout, :layout => :main_layout do
|
1018
|
+
erb :user
|
1019
|
+
end
|
1020
|
+
```
|
1021
|
+
|
1022
|
+
Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΡΡΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ
|
1023
|
+
ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π±Π»ΠΎΠΊ:
|
1024
|
+
`erb`, `haml`, `liquid`, `slim `, `wlang`.
|
1025
|
+
ΠΠ±ΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² `render` ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π±Π»ΠΎΠΊ.
|
1026
|
+
|
1027
|
+
### ΠΠΊΠ»ΡΡΡΠ½Π½ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Ρ
|
1028
|
+
|
1029
|
+
Π¨Π°Π±Π»ΠΎΠ½Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π² ΠΊΠΎΠ½ΡΠ΅ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°:
|
1030
|
+
|
1031
|
+
```ruby
|
1032
|
+
require 'sinatra'
|
1033
|
+
|
1034
|
+
get '/' do
|
1035
|
+
haml :index
|
1036
|
+
end
|
1037
|
+
|
1038
|
+
__END__
|
1039
|
+
|
1040
|
+
@@ layout
|
1041
|
+
%html
|
1042
|
+
= yield
|
1043
|
+
|
1044
|
+
@@ index
|
1045
|
+
%div.title Hello world.
|
1046
|
+
```
|
1047
|
+
|
1048
|
+
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅: Π²ΠΊΠ»ΡΡΡΠ½Π½ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π² ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ»
|
1049
|
+
Sinatra, Π±ΡΠ΄ΡΡ Π·Π°Π³ΡΡΠΆΠ΅Π½Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ. ΠΡΠ·ΠΎΠ²ΠΈΡΠ΅ `enable :inline_templates`
|
1050
|
+
Π½Π°ΠΏΡΡΠΌΡΡ, Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Π²ΠΊΠ»ΡΡΡΠ½Π½ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Ρ Π² Π΄ΡΡΠ³ΠΈΡ
ΡΠ°ΠΉΠ»Π°Ρ
.
|
1051
|
+
|
1052
|
+
### ΠΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Ρ
|
1053
|
+
|
1054
|
+
Π¨Π°Π±Π»ΠΎΠ½Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ `template` ΠΌΠ΅ΡΠΎΠ΄Π°:
|
1055
|
+
|
1056
|
+
```ruby
|
1057
|
+
template :layout do
|
1058
|
+
"%html\n =yield\n"
|
1059
|
+
end
|
1060
|
+
|
1061
|
+
template :index do
|
1062
|
+
'%div.title Hello World!'
|
1063
|
+
end
|
1064
|
+
|
1065
|
+
get '/' do
|
1066
|
+
haml :index
|
1067
|
+
end
|
1068
|
+
```
|
1069
|
+
|
1070
|
+
ΠΡΠ»ΠΈ ΡΠ°Π±Π»ΠΎΠ½ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ "layout" ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΡΠΎ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ
|
1071
|
+
ΡΠ°Π· ΠΏΡΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π΅. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΊΠ»ΡΡΠ°ΡΡ Π»ΡΠΉΠ°ΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ
|
1072
|
+
ΠΏΠΎΠΌΠΎΡΡΡ `:layout => false` ΠΈΠ»ΠΈ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ Π΅Π³ΠΎ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: `set :haml,
|
1073
|
+
:layout => false`:
|
1074
|
+
|
1075
|
+
```ruby
|
1076
|
+
get '/' do
|
1077
|
+
haml :index, :layout => !request.xhr?
|
1078
|
+
end
|
1079
|
+
```
|
1080
|
+
|
1081
|
+
### ΠΡΠΈΠ²ΡΠ·ΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ
ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ
|
1082
|
+
|
1083
|
+
Π§ΡΠΎΠ±Ρ ΡΠ²ΡΠ·Π°ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Ρ Π΄Π²ΠΈΠΆΠΊΠΎΠΌ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅
|
1084
|
+
`Tilt.register`. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ `tt` Π΄Π»Ρ
|
1085
|
+
ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² Textile:
|
1086
|
+
|
1087
|
+
```ruby
|
1088
|
+
Tilt.register :tt, Tilt[:textile]
|
1089
|
+
```
|
1090
|
+
|
1091
|
+
### ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ° ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°
|
1092
|
+
|
1093
|
+
Π‘Π½Π°ΡΠ°Π»Π° Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠΉΡΠ΅ ΡΠ²ΠΎΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ Π² Tilt, Π° Π·Π°ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠΈΠΉ
|
1094
|
+
Π·Π° ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³:
|
1095
|
+
|
1096
|
+
```ruby
|
1097
|
+
Tilt.register :myat, MyAwesomeTemplateEngine
|
1098
|
+
|
1099
|
+
helpers do
|
1100
|
+
def myat(*args) render(:myat, *args) end
|
1101
|
+
end
|
1102
|
+
|
1103
|
+
get '/' do
|
1104
|
+
myat :index
|
1105
|
+
end
|
1106
|
+
```
|
1107
|
+
|
1108
|
+
ΠΡΠΎΠ±ΡΠ°Π·ΠΈΡ `./views/index.myat`. Π§ΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ Tilt, ΡΠΌΠΎΡΡΠΈΡΠ΅
|
1109
|
+
https://github.com/rtomayko/tilt
|
1110
|
+
|
1111
|
+
## Π€ΠΈΠ»ΡΡΡΡ
|
1112
|
+
|
1113
|
+
`before`-ΡΠΈΠ»ΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΊΠ°ΠΆΠ΄ΡΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠΌ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅, ΡΡΠΎ ΠΈ
|
1114
|
+
ΠΌΠ°ΡΡΡΡΡΡ, ΠΈ ΠΌΠΎΠ³ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΊΠ°ΠΊ Π·Π°ΠΏΡΠΎΡ, ΡΠ°ΠΊ ΠΈ ΠΎΡΠ²Π΅Ρ Π½Π° Π½Π΅Π³ΠΎ. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
|
1115
|
+
ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ Π² ΡΠΈΠ»ΡΡΡΠ°Ρ
, Π΄ΠΎΡΡΡΠΏΠ½Ρ Π² ΠΌΠ°ΡΡΡΡΡΠ°Ρ
ΠΈ ΡΠ°Π±Π»ΠΎΠ½Π°Ρ
:
|
1116
|
+
|
1117
|
+
```ruby
|
1118
|
+
before do
|
1119
|
+
@note = 'Hi!'
|
1120
|
+
request.path_info = '/foo/bar/baz'
|
1121
|
+
end
|
1122
|
+
|
1123
|
+
get '/foo/*' do
|
1124
|
+
@note #=> 'Hi!'
|
1125
|
+
params[:splat] #=> 'bar/baz'
|
1126
|
+
end
|
1127
|
+
```
|
1128
|
+
|
1129
|
+
`after`-ΡΠΈΠ»ΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅
|
1130
|
+
ΠΈ ΠΌΠΎΠ³ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΊΠ°ΠΊ Π·Π°ΠΏΡΠΎΡ, ΡΠ°ΠΊ ΠΈ ΠΎΡΠ²Π΅Ρ Π½Π° Π½Π΅Π³ΠΎ. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
|
1131
|
+
ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ Π² `before`-ΡΠΈΠ»ΡΡΡΠ°Ρ
ΠΈ ΠΌΠ°ΡΡΡΡΡΠ°Ρ
, Π±ΡΠ΄ΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π²
|
1132
|
+
`after`-ΡΠΈΠ»ΡΡΡΠ°Ρ
:
|
1133
|
+
|
1134
|
+
```ruby
|
1135
|
+
after do
|
1136
|
+
puts response.status
|
1137
|
+
end
|
1138
|
+
```
|
1139
|
+
|
1140
|
+
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅: Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ `body`, Π° Π½Π΅ ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΠ΅ ΡΡΡΠΎΠΊΡ ΠΈΠ·
|
1141
|
+
ΠΌΠ°ΡΡΡΡΡΠ°, ΡΠΎ ΡΠ΅Π»ΠΎ ΠΎΡΠ²Π΅ΡΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π² `after`-ΡΠΈΠ»ΡΡΡΠ°Ρ
, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ
|
1142
|
+
Π±ΡΠ΄Π΅Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΏΠΎΠ·Π΄Π½Π΅Π΅.
|
1143
|
+
|
1144
|
+
Π€ΠΈΠ»ΡΡΡΡ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½Ρ URL ΠΈ Π±ΡΠ΄ΡΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠΎΠ²Π°Π½Ρ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ
|
1145
|
+
ΠΏΡΡΡ Π·Π°ΠΏΡΠΎΡΠ° ΡΠΎΠ²ΠΏΠ°Π΄Π΅Ρ Ρ ΡΡΠΈΠΌ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠΌ:
|
1146
|
+
|
1147
|
+
```ruby
|
1148
|
+
before '/protected/*' do
|
1149
|
+
authenticate!
|
1150
|
+
end
|
1151
|
+
|
1152
|
+
after '/create/:slug' do |slug|
|
1153
|
+
session[:last_slug] = slug
|
1154
|
+
end
|
1155
|
+
```
|
1156
|
+
|
1157
|
+
ΠΠ°ΠΊ ΠΈ ΠΌΠ°ΡΡΡΡΡΡ, ΡΠΈΠ»ΡΡΡΡ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡ:
|
1158
|
+
|
1159
|
+
```ruby
|
1160
|
+
before :agent => /Songbird/ do
|
1161
|
+
# ...
|
1162
|
+
end
|
1163
|
+
|
1164
|
+
after '/blog/*', :host_name => 'example.com' do
|
1165
|
+
# ...
|
1166
|
+
end
|
1167
|
+
```
|
1168
|
+
|
1169
|
+
## ΠΠ΅ΡΠΎΠ΄Ρ-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠΈ
|
1170
|
+
|
1171
|
+
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ `helpers`, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²
|
1172
|
+
Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°Ρ
ΠΌΠ°ΡΡΡΡΡΠΎΠ² ΠΈ ΡΠ°Π±Π»ΠΎΠ½Π°Ρ
:
|
1173
|
+
|
1174
|
+
```ruby
|
1175
|
+
helpers do
|
1176
|
+
def bar(name)
|
1177
|
+
"#{name}bar"
|
1178
|
+
end
|
1179
|
+
end
|
1180
|
+
|
1181
|
+
get '/:name' do
|
1182
|
+
bar(params[:name])
|
1183
|
+
end
|
1184
|
+
```
|
1185
|
+
|
1186
|
+
Π’Π°ΠΊΠΆΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π·Π°Π΄Π°Π½Ρ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ
ΠΌΠΎΠ΄ΡΠ»ΡΡ
:
|
1187
|
+
|
1188
|
+
```ruby
|
1189
|
+
module FooUtils
|
1190
|
+
def foo(name) "#{name}foo" end
|
1191
|
+
end
|
1192
|
+
|
1193
|
+
module BarUtils
|
1194
|
+
def bar(name) "#{name}bar" end
|
1195
|
+
end
|
1196
|
+
|
1197
|
+
helpers FooUtils, BarUtils
|
1198
|
+
```
|
1199
|
+
|
1200
|
+
ΠΡΡΠ΅ΠΊΡ ΡΠ°Π²Π½ΠΎΡΠΈΠ»Π΅Π½ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π² ΠΊΠ»Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
|
1201
|
+
|
1202
|
+
### ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΈΠΉ
|
1203
|
+
|
1204
|
+
Π‘Π΅ΡΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ ΡΠΎΡ
ΡΠ°Π½ΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ. ΠΡΠ»ΠΈ ΡΡΠ° ΠΎΠΏΡΠΈΡ
|
1205
|
+
Π²ΠΊΠ»ΡΡΠ΅Π½Π°, ΡΠΎ Ρ Π²Π°Ρ Π±ΡΠ΄Π΅Ρ ΠΎΠ΄ΠΈΠ½ Ρ
Π΅Ρ ΡΠ΅ΡΡΠΈΠΈ Π½Π° ΠΎΠ΄Π½Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΡΡ ΡΠ΅ΡΡΠΈΡ:
|
1206
|
+
|
1207
|
+
```ruby
|
1208
|
+
enable :sessions
|
1209
|
+
|
1210
|
+
get '/' do
|
1211
|
+
"value = " << session[:value].inspect
|
1212
|
+
end
|
1213
|
+
|
1214
|
+
get '/:value' do
|
1215
|
+
session[:value] = params[:value]
|
1216
|
+
end
|
1217
|
+
```
|
1218
|
+
|
1219
|
+
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ `enable :sessions` Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΡ
ΡΠ°Π½ΡΡΡΡΡ Π²
|
1220
|
+
ΠΊΡΠΊΠ°Ρ
(cookies). ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠΎ, ΡΡΠΎ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
|
1221
|
+
ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠΈΡ
ΠΎΠ±ΡΠ΅ΠΌΠΎΠ² Π΄Π°Π½Π½ΡΡ
ΡΠ²Π΅Π»ΠΈΡΠΈΡ Π²Π°Ρ ΡΡΠ°ΡΠΈΠΊ). Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Ρ
|
1222
|
+
ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΡ Rack "ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΡ" (middleware), ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΡΡ
|
1223
|
+
ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ ΡΠ΅ΡΡΠΈΠΉ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ *Π½Π΅ Π½Π°Π΄ΠΎ* Π²ΡΠ·ΡΠ²Π°ΡΡ `enable :sessions`, Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ
|
1224
|
+
ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Π΅Π΅ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π»ΡΠ±ΡΡ Π΄ΡΡΠ³ΡΡ "ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΡ":
|
1225
|
+
|
1226
|
+
```ruby
|
1227
|
+
use Rack::Session::Pool, :expire_after => 2592000
|
1228
|
+
|
1229
|
+
get '/' do
|
1230
|
+
"value = " << session[:value].inspect
|
1231
|
+
end
|
1232
|
+
|
1233
|
+
get '/:value' do
|
1234
|
+
session[:value] = params[:value]
|
1235
|
+
end
|
1236
|
+
```
|
1237
|
+
|
1238
|
+
ΠΠ»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ Π² ΠΊΡΠΊΠ°Ρ
ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΌ
|
1239
|
+
ΠΊΠ»ΡΡΠΎΠΌ. Π‘Π΅ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ Sinatra. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΎΡ ΠΊΠ»ΡΡ
|
1240
|
+
Π±ΡΠ΄Π΅Ρ ΠΌΠ΅Π½ΡΡΡΡΡ Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ Π·Π°ΠΏΡΡΠΊΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π²Ρ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Ρ
ΠΎΡΠΈΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ
|
1241
|
+
ΠΊΠ»ΡΡ Π²ΡΡΡΠ½ΡΡ, ΡΡΠΎΠ±Ρ Ρ Π²ΡΠ΅Ρ
ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π±ΡΠ» ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅
|
1242
|
+
ΠΊΠ»ΡΡ:
|
1243
|
+
|
1244
|
+
```ruby
|
1245
|
+
set :session_secret, 'super secret'
|
1246
|
+
```
|
1247
|
+
|
1248
|
+
ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΠΉ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°Π΄Π°ΡΡ ΠΈΡ
, ΠΏΠ΅ΡΠ΅Π΄Π°Π² Ρ
Π΅Ρ
|
1249
|
+
ΠΎΠΏΡΠΈΠΉ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ `sessions`:
|
1250
|
+
|
1251
|
+
```ruby
|
1252
|
+
set :sessions, :domain => 'foo.com'
|
1253
|
+
```
|
1254
|
+
|
1255
|
+
Π§ΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ΅ΡΡΠΈΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ, ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΡΠΌ Π½Π° ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½Π°Ρ
|
1256
|
+
foo.com, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ *.* ΠΏΠ΅ΡΠ΅Π΄ Π΄ΠΎΠΌΠ΅Π½ΠΎΠΌ:
|
1257
|
+
|
1258
|
+
``` ruby
|
1259
|
+
set :sessions, :domain => '.foo.com'
|
1260
|
+
```
|
1261
|
+
|
1262
|
+
### ΠΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅
|
1263
|
+
|
1264
|
+
Π§ΡΠΎΠ±Ρ Π½Π΅Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠ΅ΡΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π·Π°ΠΏΡΠΎΡΠ° Π²Π½ΡΡΡΠΈ ΡΠΈΠ»ΡΡΡΠ° ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΡΡΡΠ°,
|
1265
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅:
|
1266
|
+
|
1267
|
+
```ruby
|
1268
|
+
halt
|
1269
|
+
```
|
1270
|
+
|
1271
|
+
ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΡΠΊΠ°Π·Π°ΡΡ ΡΡΠ°ΡΡΡ ΠΏΡΠΈ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΈ:
|
1272
|
+
|
1273
|
+
```ruby
|
1274
|
+
halt 410
|
1275
|
+
```
|
1276
|
+
|
1277
|
+
Π’Π΅Π»ΠΎ:
|
1278
|
+
|
1279
|
+
```ruby
|
1280
|
+
halt 'this will be the body'
|
1281
|
+
```
|
1282
|
+
|
1283
|
+
Π ΡΠΎ, ΠΈ Π΄ΡΡΠ³ΠΎΠ΅:
|
1284
|
+
|
1285
|
+
```ruby
|
1286
|
+
halt 401, 'go away!'
|
1287
|
+
```
|
1288
|
+
|
1289
|
+
ΠΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ:
|
1290
|
+
|
1291
|
+
```ruby
|
1292
|
+
halt 402, {'Content-Type' => 'text/plain'}, 'revenge'
|
1293
|
+
```
|
1294
|
+
|
1295
|
+
Π, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½Ρ Ρ `halt`:
|
1296
|
+
|
1297
|
+
```ruby
|
1298
|
+
halt erb(:error)
|
1299
|
+
```
|
1300
|
+
|
1301
|
+
### ΠΠ΅ΡΠ΅Π΄Π°ΡΠ°
|
1302
|
+
|
1303
|
+
ΠΠ°ΡΡΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π·Π°ΠΏΡΠΎΡΠ° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡΠ΅ΠΌΡ ΠΌΠ°ΡΡΡΡΡΡ,
|
1304
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ `pass`:
|
1305
|
+
|
1306
|
+
```ruby
|
1307
|
+
get '/guess/:who' do
|
1308
|
+
pass unless params[:who] == 'Frank'
|
1309
|
+
'You got me!'
|
1310
|
+
end
|
1311
|
+
|
1312
|
+
get '/guess/*' do
|
1313
|
+
'You missed!'
|
1314
|
+
end
|
1315
|
+
```
|
1316
|
+
|
1317
|
+
ΠΠ»ΠΎΠΊ ΠΌΠ°ΡΡΡΡΡΠ° ΡΡΠ°Π·Ρ ΠΆΠ΅ ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΡΡΡ, ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ
|
1318
|
+
ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡΠ΅ΠΌΡ ΠΌΠ°ΡΡΡΡΡΡ. ΠΡΠ»ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΌΠ°ΡΡΡΡΡ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, ΡΠΎ ΠΎΡΠ²Π΅ΡΠΎΠΌ Π½Π°
|
1319
|
+
Π·Π°ΠΏΡΠΎΡ Π±ΡΠ΄Π΅Ρ 404.
|
1320
|
+
|
1321
|
+
### ΠΡΠ·ΠΎΠ² Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΡΡΡΠ°
|
1322
|
+
|
1323
|
+
ΠΠ½ΠΎΠ³Π΄Π° `pass` Π½Π΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠ·ΠΎΠ²Π°
|
1324
|
+
Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΌΠ°ΡΡΡΡΡΠ°. Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ `call`:
|
1325
|
+
|
1326
|
+
```ruby
|
1327
|
+
get '/foo' do
|
1328
|
+
status, headers, body = call env.merge("PATH_INFO" => '/bar')
|
1329
|
+
[status, headers, body.map(&:upcase)]
|
1330
|
+
end
|
1331
|
+
|
1332
|
+
get '/bar' do
|
1333
|
+
"bar"
|
1334
|
+
end
|
1335
|
+
```
|
1336
|
+
|
1337
|
+
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π»Π΅Π³ΡΠΈΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ²ΡΡΠΈΡΡ
|
1338
|
+
ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡ `"bar"` Π² ΠΌΠ΅ΡΠΎΠ΄-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΈ Π²
|
1339
|
+
`/foo`, ΠΈ Π² `/bar`.
|
1340
|
+
|
1341
|
+
ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅, ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΠΎΡ Π±ΡΠ» ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ Π² ΡΠΎΡ ΠΆΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π° Π½Π΅
|
1342
|
+
Π² Π΅Π³ΠΎ ΠΊΠΎΠΏΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ `call!` Π²ΠΌΠ΅ΡΡΠΎ `call`.
|
1343
|
+
|
1344
|
+
ΠΡΠ»ΠΈ Ρ
ΠΎΡΠΈΡΠ΅ ΡΠ·Π½Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ `call`, ΡΠΌΠΎΡΡΠΈΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Rack.
|
1345
|
+
|
1346
|
+
### ΠΠ°Π΄Π°Π½ΠΈΠ΅ ΡΠ΅Π»Π°, ΠΊΠΎΠ΄Π° ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΎΡΠ²Π΅ΡΠ°
|
1347
|
+
|
1348
|
+
Π₯ΠΎΡΠΎΡΠΈΠΌ ΡΠΎΠ½ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΊΠΎΠ΄Π° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ HTTP ΠΈ ΡΠ΅Π»Π° ΠΎΡΠ²Π΅ΡΠ° Π²
|
1349
|
+
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΌΠ°ΡΡΡΡΡΠ°. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
|
1350
|
+
ΡΠΈΡΡΠ°ΡΠΈΡΡ
Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π·Π°Π΄Π°ΡΡ ΡΠ΅Π»ΠΎ ΠΎΡΠ²Π΅ΡΠ° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠ΅
|
1351
|
+
ΠΏΠΎΡΠΎΠΊΠ° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠ° `body`.
|
1352
|
+
ΠΡΠ»ΠΈ Π²Ρ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΡΠ΅ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ `body`, ΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΈ Π²
|
1353
|
+
Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΅Π»Ρ ΠΎΡΠ²Π΅ΡΠ°.
|
1354
|
+
|
1355
|
+
```ruby
|
1356
|
+
get '/foo' do
|
1357
|
+
body "bar"
|
1358
|
+
end
|
1359
|
+
|
1360
|
+
after do
|
1361
|
+
puts body
|
1362
|
+
end
|
1363
|
+
```
|
1364
|
+
|
1365
|
+
Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π±Π»ΠΎΠΊ Π² ΠΌΠ΅ΡΠΎΠ΄ `body`, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΡΠ΅ΠΌ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½
|
1366
|
+
ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ Rack (ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ
|
1367
|
+
ΠΏΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΎΡΠ²Π΅ΡΠ°, ΡΠΌ. "ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ").
|
1368
|
+
|
1369
|
+
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΊΠΎΠ΄ ΠΎΡΠ²Π΅ΡΠ° ΠΈ Π΅Π³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ:
|
1370
|
+
|
1371
|
+
```ruby
|
1372
|
+
get '/foo' do
|
1373
|
+
status 418
|
1374
|
+
headers \
|
1375
|
+
"Allow" => "BREW, POST, GET, PROPFIND, WHEN",
|
1376
|
+
"Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
|
1377
|
+
body "I'm a tea pot!"
|
1378
|
+
end
|
1379
|
+
```
|
1380
|
+
|
1381
|
+
ΠΠ°ΠΊ ΠΈ `body`, ΠΌΠ΅ΡΠΎΠ΄Ρ `headers` ΠΈ `status`, Π²ΡΠ·Π²Π°Π½Π½ΡΠ΅ Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²,
|
1382
|
+
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΠ²ΠΎΠΈ ΡΠ΅ΠΊΡΡΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
|
1383
|
+
|
1384
|
+
### Π‘ΡΡΠΈΠΌΠΈΠ½Π³ ΠΎΡΠ²Π΅ΡΠΎΠ²
|
1385
|
+
|
1386
|
+
ΠΠ½ΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π°ΡΠ°ΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΏΡΡΠΌΠΎ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅
|
1387
|
+
Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΡΡΠ΅ΠΉ ΡΡΠΈΡ
Π΄Π°Π½Π½ΡΡ
. Π ΠΎΡΠΎΠ±ΡΡ
ΡΠ»ΡΡΠ°ΡΡ
ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ
|
1388
|
+
ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ Π΄ΠΎ ΡΠ΅Ρ
ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ Π·Π°ΠΊΡΠΎΠ΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅
|
1389
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ `stream` Π²ΠΌΠ΅ΡΡΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ
"ΠΎΠ±Π΅ΡΡΠΎΠΊ".
|
1390
|
+
|
1391
|
+
```ruby
|
1392
|
+
get '/' do
|
1393
|
+
stream do |out|
|
1394
|
+
out << "It's gonna be legen -\n"
|
1395
|
+
sleep 0.5
|
1396
|
+
out << " (wait for it) \n"
|
1397
|
+
sleep 1
|
1398
|
+
out << "- dary!\n"
|
1399
|
+
end
|
1400
|
+
end
|
1401
|
+
```
|
1402
|
+
|
1403
|
+
Π§ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π°ΠΌ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΡΠΈΠΌΠΈΠ½Π³ΠΎΠ²ΡΠ΅ API,
|
1404
|
+
[Server Sent Events](http://dev.w3.org/html5/eventsource/),
|
1405
|
+
ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΠΆΠΈΡΡ ΠΎΡΠ½ΠΎΠ²ΠΎΠΉ Π΄Π»Ρ [WebSockets](http://en.wikipedia.org/wiki/WebSocket).
|
1406
|
+
Π’Π°ΠΊΠΆΠ΅ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π² ΡΠ»ΡΡΠ°Π΅,
|
1407
|
+
ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ ΡΠ°ΡΡΡ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΡΡΠ°.
|
1408
|
+
|
1409
|
+
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΡΡΠΈΠΌΠΈΠ½Π³Π°, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ
|
1410
|
+
ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ², ΠΎΡΠ΅Π½Ρ ΡΠΈΠ»ΡΠ½ΠΎ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ°.
|
1411
|
+
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, WEBRick, ΠΌΠΎΠ³ΡΡ ΠΈ Π²ΠΎΠ²ΡΠ΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΡΡΠΈΠΌΠΈΠ½Π³.
|
1412
|
+
ΠΡΠ»ΠΈ ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΡΡΠΈΠΌΠΈΠ½Π³, ΡΠΎ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ΄ΡΡ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Ρ Π·Π° ΠΎΠ΄ΠΈΠ½
|
1413
|
+
ΡΠ°Π· ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊ, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΉ Π² `stream`, Π·Π°Π²Π΅ΡΡΠΈΡΡΡ. Π‘ΡΡΠΈΠΌΠΈΠ½Π³
|
1414
|
+
Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Shotgun.
|
1415
|
+
|
1416
|
+
ΠΡΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ `keep_open`, ΡΠΎ ΠΎΠ½ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ
|
1417
|
+
`close` Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΏΠΎΡΠΎΠΊΠ°, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π²Π°ΠΌ Π·Π°ΠΊΡΡΡΡ Π΅Π³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅ Π² Π»ΡΠ±ΠΎΠΌ Π΄ΡΡΠ³ΠΎΠΌ
|
1418
|
+
ΠΌΠ΅ΡΡΠ΅. ΠΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΡΠΎΠ±ΡΡΠΈΠΉΠ½ΡΠΌΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°ΠΌΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ Thin ΠΈ
|
1419
|
+
Rainbows. ΠΡΡΠ³ΠΈΠ΅ ΠΆΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π±ΡΠ΄ΡΡ Π·Π°ΠΊΡΡΠ²Π°ΡΡ ΠΏΠΎΡΠΎΠΊ:
|
1420
|
+
|
1421
|
+
```ruby
|
1422
|
+
# long polling
|
1423
|
+
|
1424
|
+
set :server, :thin
|
1425
|
+
connections = []
|
1426
|
+
|
1427
|
+
get '/subscribe' do
|
1428
|
+
# ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
|
1429
|
+
stream(:keep_open) { |out| connections << out }
|
1430
|
+
|
1431
|
+
# ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ "ΠΌΠ΅ΡΡΠ²ΡΡ
ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ²"
|
1432
|
+
connections.reject!(&:closed?)
|
1433
|
+
|
1434
|
+
# Π΄ΠΎΠΏΡΡΠΊ
|
1435
|
+
"subscribed"
|
1436
|
+
end
|
1437
|
+
|
1438
|
+
post '/message' do
|
1439
|
+
connections.each do |out|
|
1440
|
+
# ΡΠ²Π΅Π΄ΠΎΠΌΠΈΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΎ Π½ΠΎΠ²ΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ
|
1441
|
+
out << params[:message] << "\n"
|
1442
|
+
|
1443
|
+
#Β ΡΠΊΠ°Π·Π°ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π½Π° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΠ½ΠΎΠ²Π° ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ
|
1444
|
+
out.close
|
1445
|
+
end
|
1446
|
+
|
1447
|
+
# Π΄ΠΎΠΏΡΡΠΊ
|
1448
|
+
"message received"
|
1449
|
+
end
|
1450
|
+
```
|
1451
|
+
|
1452
|
+
### ΠΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
|
1453
|
+
|
1454
|
+
Π ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°ΠΏΡΠΎΡΠ° ΠΌΠ΅ΡΠΎΠ΄ `logger` ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ
|
1455
|
+
`Logger`:
|
1456
|
+
|
1457
|
+
```ruby
|
1458
|
+
get '/' do
|
1459
|
+
logger.info "loading data"
|
1460
|
+
# ...
|
1461
|
+
end
|
1462
|
+
```
|
1463
|
+
|
1464
|
+
ΠΡΠΎΡ Π»ΠΎΠ³Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π²Π°ΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² Rack. ΠΡΠ»ΠΈ
|
1465
|
+
Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠΊΠ»ΡΡΠ΅Π½ΠΎ, ΡΠΎ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π²Π΅ΡΠ½Π΅Ρ ΠΏΡΡΡΠΎΠΉ (dummy) ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ
|
1466
|
+
ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΌΠ΅Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π² ΠΌΠ°ΡΡΡΡΡΠ°Ρ
ΠΈ ΡΠΈΠ»ΡΡΡΠ°Ρ
.
|
1467
|
+
|
1468
|
+
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ
|
1469
|
+
`Sinatra::Application`, Π° Π΅ΡΠ»ΠΈ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ β ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ `Sinatra::Base`, ΡΠΎ
|
1470
|
+
Π²Ρ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, Π·Π°Ρ
ΠΎΡΠΈΡΠ΅ Π²ΠΊΠ»ΡΡΠΈΡΡ Π΅Π³ΠΎ Π²ΡΡΡΠ½ΡΡ:
|
1471
|
+
|
1472
|
+
```ruby
|
1473
|
+
class MyApp < Sinatra::Base
|
1474
|
+
configure :production, :development do
|
1475
|
+
enable :logging
|
1476
|
+
end
|
1477
|
+
end
|
1478
|
+
```
|
1479
|
+
|
1480
|
+
Π§ΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π»ΡΠ±ΠΎΠΉ Π»ΠΎΠ³ΠΈΡΡΡΡΠ΅ΠΉ "ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΠΈ", Π·Π°Π΄Π°ΠΉΡΠ΅ ΠΎΠΏΡΠΈΠΈ
|
1481
|
+
`logging` Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ `nil`. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π½Π΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅, ΡΡΠΎ Π² ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ
|
1482
|
+
`logger` Π²Π΅ΡΠ½Π΅Ρ `nil`. Π§Π°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΊ Π΄Π΅Π»Π°ΡΡ, ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π°ΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ
|
1483
|
+
Π»ΠΎΠ³Π΅Ρ. Sinatra Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎ, ΡΡΠΎ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² `env['rack.logger']`.
|
1484
|
+
|
1485
|
+
### Mime-ΡΠΈΠΏΡ
|
1486
|
+
|
1487
|
+
ΠΠΎΠ³Π΄Π° Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ `send_file` ΠΈΠ»ΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ, Ρ Π²Π°Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ
|
1488
|
+
mime-ΡΠΈΠΏΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Sinatra Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ `mime_type`
|
1489
|
+
Π΄Π»Ρ ΠΈΡ
ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°:
|
1490
|
+
|
1491
|
+
```ruby
|
1492
|
+
configure do
|
1493
|
+
mime_type :foo, 'text/foo'
|
1494
|
+
end
|
1495
|
+
```
|
1496
|
+
|
1497
|
+
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎ Π² `content_type` ΠΌΠ΅ΡΠΎΠ΄Π΅-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠ΅:
|
1498
|
+
|
1499
|
+
```ruby
|
1500
|
+
get '/' do
|
1501
|
+
content_type :foo
|
1502
|
+
"foo foo foo"
|
1503
|
+
end
|
1504
|
+
```
|
1505
|
+
|
1506
|
+
### ΠΠ΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ URL
|
1507
|
+
|
1508
|
+
Π§ΡΠΎΠ±Ρ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ URL, Π²Π°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ `url`, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Haml:
|
1509
|
+
|
1510
|
+
```ruby
|
1511
|
+
%a{:href => url('/foo')} foo
|
1512
|
+
```
|
1513
|
+
|
1514
|
+
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ°ΡΠ½ΡΠ΅ ΠΏΡΠΎΠΊΡΠΈ ΠΈ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΡ Rack, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ
|
1515
|
+
ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ.
|
1516
|
+
|
1517
|
+
ΠΠ°ΡΡΠ΄Ρ Ρ `url` Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ `to` (ΡΠΌΠΎΡΡΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Π½ΠΈΠΆΠ΅).
|
1518
|
+
|
1519
|
+
### ΠΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ (ΡΠ΅Π΄ΠΈΡΠ΅ΠΊΡ)
|
1520
|
+
|
1521
|
+
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²ΠΈΡΡ Π±ΡΠ°ΡΠ·Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° `redirect`:
|
1522
|
+
|
1523
|
+
```ruby
|
1524
|
+
get '/foo' do
|
1525
|
+
redirect to('/bar')
|
1526
|
+
end
|
1527
|
+
```
|
1528
|
+
|
1529
|
+
ΠΡΠ±ΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°
|
1530
|
+
`halt`:
|
1531
|
+
|
1532
|
+
```ruby
|
1533
|
+
redirect to('/bar'), 303
|
1534
|
+
redirect 'http://google.com', 'wrong place, buddy'
|
1535
|
+
```
|
1536
|
+
|
1537
|
+
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²ΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ, Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΠ½
|
1538
|
+
ΠΏΡΠΈΡΠ΅Π», Ρ ΠΏΠΎΠΌΠΎΡΡΡ `redirect back`:
|
1539
|
+
|
1540
|
+
```ruby
|
1541
|
+
get '/foo' do
|
1542
|
+
"<a href='/bar'>do something</a>"
|
1543
|
+
end
|
1544
|
+
|
1545
|
+
get '/bar' do
|
1546
|
+
do_something
|
1547
|
+
redirect back
|
1548
|
+
end
|
1549
|
+
```
|
1550
|
+
|
1551
|
+
Π§ΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ, Π»ΠΈΠ±ΠΎ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅
|
1552
|
+
ΠΈΡ
Π² ΡΡΡΠΎΠΊΡ Π·Π°ΠΏΡΠΎΡΠ°:
|
1553
|
+
|
1554
|
+
```ruby
|
1555
|
+
redirect to('/bar?sum=42')
|
1556
|
+
```
|
1557
|
+
|
1558
|
+
Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ΅ΡΡΠΈΡ:
|
1559
|
+
|
1560
|
+
```ruby
|
1561
|
+
enable :sessions
|
1562
|
+
|
1563
|
+
get '/foo' do
|
1564
|
+
session[:secret] = 'foo'
|
1565
|
+
redirect to('/bar')
|
1566
|
+
end
|
1567
|
+
|
1568
|
+
get '/bar' do
|
1569
|
+
session[:secret]
|
1570
|
+
end
|
1571
|
+
```
|
1572
|
+
|
1573
|
+
### Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
|
1574
|
+
|
1575
|
+
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΡ
Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² β ΠΎΡΠ½ΠΎΠ²Π° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ HTTP ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
|
1576
|
+
|
1577
|
+
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π»Π΅Π³ΠΊΠΎ Π²ΡΡΡΠ°Π²ΠΈΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Cache-Control ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
|
1578
|
+
|
1579
|
+
```ruby
|
1580
|
+
get '/' do
|
1581
|
+
cache_control :public
|
1582
|
+
"cache it!"
|
1583
|
+
end
|
1584
|
+
```
|
1585
|
+
|
1586
|
+
Π‘ΠΎΠ²Π΅Ρ: Π·Π°Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² `before`-ΡΠΈΠ»ΡΡΡΠ΅:
|
1587
|
+
|
1588
|
+
```ruby
|
1589
|
+
before do
|
1590
|
+
cache_control :public, :must_revalidate, :max_age => 60
|
1591
|
+
end
|
1592
|
+
```
|
1593
|
+
|
1594
|
+
ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ `expires` Π΄Π»Ρ Π·Π°Π΄Π°Π½ΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, ΡΠΎ
|
1595
|
+
`Cache-Control` Π±ΡΠ΄Π΅Ρ Π²ΡΡΡΠ°Π²Π»Π΅Π½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ:
|
1596
|
+
|
1597
|
+
```ruby
|
1598
|
+
before do
|
1599
|
+
expires 500, :public, :must_revalidate
|
1600
|
+
end
|
1601
|
+
```
|
1602
|
+
|
1603
|
+
Π§ΡΠΎΠ±Ρ ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, Π²Π°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠΎΠ΄ΡΠΌΠ°ΡΡ ΠΎΠ±
|
1604
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ `etag` ΠΈΠ»ΠΈ `last_modified`. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈ
|
1605
|
+
ΠΌΠ΅ΡΠΎΠ΄Ρ-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠΈ *Π΄ΠΎ* Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠΈΡ
Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ
|
1606
|
+
Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΎΡΠΏΡΠ°Π²ΡΡ ΠΎΡΠ²Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡ, Π΅ΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΠ°Ρ Π²Π΅ΡΡΠΈΡ ΡΠΆΠ΅ Π΅ΡΡΡ Π² ΠΈΡ
ΠΊΡΡΠ΅:
|
1607
|
+
|
1608
|
+
```ruby
|
1609
|
+
get '/article/:id' do
|
1610
|
+
@article = Article.find params[:id]
|
1611
|
+
last_modified @article.updated_at
|
1612
|
+
etag @article.sha1
|
1613
|
+
erb :article
|
1614
|
+
end
|
1615
|
+
```
|
1616
|
+
|
1617
|
+
Π’Π°ΠΊΠΆΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
|
1618
|
+
[weak ETag](http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation):
|
1619
|
+
|
1620
|
+
```ruby
|
1621
|
+
etag @article.sha1, :weak
|
1622
|
+
```
|
1623
|
+
|
1624
|
+
ΠΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠΈ Π½Π΅ ΡΡΠ°Π½ΡΡ Π½ΠΈΡΠ΅Π³ΠΎ ΠΊΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π²Π°Ρ, Π½ΠΎ ΠΎΠ½ΠΈ Π΄Π°Π΄ΡΡ
|
1625
|
+
Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΊΡΡΠ°. ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠ΅ΡΠ΅ Π»Π΅Π³ΠΊΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ
|
1626
|
+
ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ [rack-cache](https://github.com/rtomayko/rack-cache):
|
1627
|
+
|
1628
|
+
```ruby
|
1629
|
+
require 'rack/cache'
|
1630
|
+
require 'sinatra'
|
1631
|
+
|
1632
|
+
use Rack::Cache
|
1633
|
+
|
1634
|
+
get '/' do
|
1635
|
+
cache_control :public, :max_age => 36000
|
1636
|
+
sleep 5
|
1637
|
+
"hello"
|
1638
|
+
end
|
1639
|
+
```
|
1640
|
+
|
1641
|
+
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΎΠΏΡΠΈΡ `:static_cache_control` (ΡΠΌ. Π½ΠΈΠΆΠ΅), ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ
|
1642
|
+
`Cache-Control` ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠ°ΠΉΠ»Π°ΠΌ.
|
1643
|
+
|
1644
|
+
Π ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ RFC 2616 Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ, ΠΊΠΎΠ³Π΄Π°
|
1645
|
+
Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ If-Match ΠΈΠ»ΠΈ If-None-Match ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ `*`, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ
|
1646
|
+
ΡΠΎΠ³ΠΎ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈΠ»ΠΈ Π½Π΅Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΠΉ ΡΠ΅ΡΡΡΡ. Sinatra ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ, ΡΡΠΎ
|
1647
|
+
ΡΠ΅ΡΡΡΡΡ, ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ
(GET) ΠΈ ΠΈΠ΄Π΅ΠΌΠΏΠΎΡΠ΅Π½ΡΠ½ΡΡ
(PUT)
|
1648
|
+
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ, Π° ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ (ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
|
1649
|
+
Ρ ΠΏΠΎΠΌΠΎΡΡΡ POST) ΡΡΠΈΡΠ°Π΅Ρ Π½ΠΎΠ²ΡΠΌΠΈ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
|
1650
|
+
ΠΎΠΏΡΠΈΠΈ `:new_resource`:
|
1651
|
+
|
1652
|
+
```ruby
|
1653
|
+
get '/create' do
|
1654
|
+
etag '', :new_resource => true
|
1655
|
+
Article.create
|
1656
|
+
erb :new_article
|
1657
|
+
end
|
1658
|
+
```
|
1659
|
+
|
1660
|
+
ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ weak ETag, Π·Π°Π΄Π°ΠΉΡΠ΅ ΠΎΠΏΡΠΈΡ `:kind`:
|
1661
|
+
|
1662
|
+
```ruby
|
1663
|
+
etag '', :new_resource => true, :kind => :weak
|
1664
|
+
```
|
1665
|
+
|
1666
|
+
### ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ²
|
1667
|
+
|
1668
|
+
ΠΠ»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ `send_file`:
|
1669
|
+
|
1670
|
+
```ruby
|
1671
|
+
get '/' do
|
1672
|
+
send_file 'foo.png'
|
1673
|
+
end
|
1674
|
+
```
|
1675
|
+
|
1676
|
+
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΡΠΈΠΉ:
|
1677
|
+
|
1678
|
+
```ruby
|
1679
|
+
send_file 'foo.png', :type => :jpg
|
1680
|
+
```
|
1681
|
+
|
1682
|
+
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ:
|
1683
|
+
|
1684
|
+
<dl>
|
1685
|
+
<dt>filename</dt>
|
1686
|
+
<dd>ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: ΡΠ΅Π°Π»ΡΠ½ΠΎΠ΅ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°.</dd>
|
1687
|
+
|
1688
|
+
<dt>last_modified</dt>
|
1689
|
+
<dd>Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Last-Modified, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: mtime (Π²ΡΠ΅ΠΌΡ
|
1690
|
+
ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ) ΡΠ°ΠΉΠ»Π°.</dd>
|
1691
|
+
|
1692
|
+
<dt>type</dt>
|
1693
|
+
<dd>ΡΠΈΠΏ ΡΠ°ΠΉΠ»Π°, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°.</dd>
|
1694
|
+
|
1695
|
+
<dt>disposition</dt>
|
1696
|
+
<dd>ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Content-Disposition, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ: <tt>nil</tt>
|
1697
|
+
(ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ), <tt>:attachment</tt> ΠΈ <tt>:inline</tt>.</dd>
|
1698
|
+
|
1699
|
+
<dt>length</dt>
|
1700
|
+
<dd>Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Content-Length, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°ΠΉΠ»Π°.</dd>
|
1701
|
+
|
1702
|
+
<dt>status</dt>
|
1703
|
+
<dd>ΠΠΎΠ΄ ΠΎΡΠ²Π΅ΡΠ°. ΠΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΎΡΠ΄Π°Π΅ΡΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°ΠΉΠ» Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΡΠ°Π½ΠΈΡΡ Ρ
|
1704
|
+
ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅.</dd>
|
1705
|
+
</dl>
|
1706
|
+
|
1707
|
+
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Rack ΡΠ΅ΡΠ²Π΅ΡΠ° Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²,
|
1708
|
+
Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ, Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ΄Π΅Ρ Π½Π°ΠΏΡΡΠΌΡΡ ΠΎΡΠ΄Π°Π²Π°ΡΡ ΡΠ°ΠΉΠ» ΠΈΠ· Ruby
|
1709
|
+
ΠΏΡΠΎΡΠ΅ΡΡΠ°. ΠΠ΅ΡΠΎΠ΄ `send_file` ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ
|
1710
|
+
ΡΠ°ΡΡΠΈΡΠ½ΡΡ
(range) Π·Π°ΠΏΡΠΎΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ Sinatra.
|
1711
|
+
|
1712
|
+
### ΠΠΎΡΡΡΠΏ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π·Π°ΠΏΡΠΎΡΠ°
|
1713
|
+
|
1714
|
+
ΠΠ±ΡΠ΅ΠΊΡ Π²Ρ
ΠΎΠ΄ΡΡΠ΅Π³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π·Π°ΠΏΡΠΎΡΠ° (Π² ΡΠΈΠ»ΡΡΡΠ°Ρ
,
|
1715
|
+
ΠΌΠ°ΡΡΡΡΡΠ°Ρ
, ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°Ρ
ΠΎΡΠΈΠ±ΠΎΠΊ) Ρ ΠΏΠΎΠΌΠΎΡΡΡ `request` ΠΌΠ΅ΡΠΎΠ΄Π°:
|
1716
|
+
|
1717
|
+
```ruby
|
1718
|
+
# ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ Π½Π° http://example.com/example
|
1719
|
+
get '/foo' do
|
1720
|
+
t = %w[text/css text/html application/javascript]
|
1721
|
+
request.accept # ['text/html', '*/*']
|
1722
|
+
request.accept? 'text/xml' # true
|
1723
|
+
request.preferred_type(t) # 'text/html'
|
1724
|
+
request.body # ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ°, ΠΏΠΎΡΠ»Π°Π½Π½ΠΎΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ (ΡΠΌ. Π½ΠΈΠΆΠ΅)
|
1725
|
+
request.scheme # "http"
|
1726
|
+
request.script_name # "/example"
|
1727
|
+
request.path_info # "/foo"
|
1728
|
+
request.port # 80
|
1729
|
+
request.request_method # "GET"
|
1730
|
+
request.query_string # ""
|
1731
|
+
request.content_length # Π΄Π»ΠΈΠ½Π° ΡΠ΅Π»Π° Π·Π°ΠΏΡΠΎΡΠ°
|
1732
|
+
request.media_type # ΠΌΠ΅Π΄ΠΈΠ°ΡΠΈΠΏ ΡΠ΅Π»Π° Π·Π°ΠΏΡΠΎΡΠ°
|
1733
|
+
request.host # "example.com"
|
1734
|
+
request.get? # true (Π΅ΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈ Π΄Π»Ρ Π΄ΡΡΠ³ΠΈΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² HTTP)
|
1735
|
+
request.form_data? # false
|
1736
|
+
request["some_param"] # Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° some_param. Π¨ΠΎΡΡΠΊΠ°Ρ Π΄Π»Ρ Ρ
Π΅ΡΠ° params
|
1737
|
+
request.referrer # ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π·Π°ΠΏΡΠΎΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π»ΠΈΠ±ΠΎ '/'
|
1738
|
+
request.user_agent # user agent (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ :agent ΡΡΠ»ΠΎΠ²ΠΈΡ)
|
1739
|
+
request.cookies # Ρ
Π΅Ρ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ cookies Π±ΡΠ°ΡΠ·Π΅ΡΠ°
|
1740
|
+
request.xhr? # ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ Π·Π°ΠΏΡΠΎΡ ajax Π·Π°ΠΏΡΠΎΡΠΎΠΌ?
|
1741
|
+
request.url # "http://example.com/example/foo"
|
1742
|
+
request.path # "/example/foo"
|
1743
|
+
request.ip # IP-Π°Π΄ΡΠ΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
|
1744
|
+
request.secure? # false (true, Π΅ΡΠ»ΠΈ Π·Π°ΠΏΡΠΎΡ ΡΠ΄Π΅Π»Π°Π½ ΡΠ΅ΡΠ΅Π· SSL)
|
1745
|
+
request.forwarded? # true (Π΅ΡΠ»ΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π·Π° ΠΎΠ±ΡΠ°ΡΠ½ΡΠΌ ΠΏΡΠΎΠΊΡΠΈ)
|
1746
|
+
request.env # "ΡΡΡΠΎΠΉ" env Ρ
Π΅Ρ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ Rack
|
1747
|
+
end
|
1748
|
+
```
|
1749
|
+
|
1750
|
+
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΡΠΈΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ `script_name` ΠΈΠ»ΠΈ `path_info`, Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄Π»Ρ
|
1751
|
+
ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:
|
1752
|
+
|
1753
|
+
```ruby
|
1754
|
+
before { request.path_info = "/" }
|
1755
|
+
|
1756
|
+
get "/" do
|
1757
|
+
"all requests end up here"
|
1758
|
+
end
|
1759
|
+
```
|
1760
|
+
|
1761
|
+
`request.body` ΡΠ²Π»ΡΠ΅ΡΡΡ IO ΠΈΠ»ΠΈ StringIO ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ:
|
1762
|
+
|
1763
|
+
```ruby
|
1764
|
+
post "/api" do
|
1765
|
+
request.body.rewind # Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ ΡΠΆΠ΅ ΠΏΡΠΎΡΠΈΡΠ°Π» ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ°
|
1766
|
+
data = JSON.parse request.body.read
|
1767
|
+
"Hello #{data['name']}!"
|
1768
|
+
end
|
1769
|
+
```
|
1770
|
+
|
1771
|
+
### ΠΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
|
1772
|
+
|
1773
|
+
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ `attachment`, ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ Π±ΡΠ°ΡΠ·Π΅ΡΡ, ΡΡΠΎ ΠΎΡΠ²Π΅Ρ
|
1774
|
+
ΡΠ΅ΡΠ²Π΅ΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ Π½Π° Π΄ΠΈΡΠΊ, Π° Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½:
|
1775
|
+
|
1776
|
+
```ruby
|
1777
|
+
get '/' do
|
1778
|
+
attachment
|
1779
|
+
"store it!"
|
1780
|
+
end
|
1781
|
+
```
|
1782
|
+
|
1783
|
+
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΡ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°:
|
1784
|
+
|
1785
|
+
```ruby
|
1786
|
+
get '/' do
|
1787
|
+
attachment "info.txt"
|
1788
|
+
"store it!"
|
1789
|
+
end
|
1790
|
+
```
|
1791
|
+
|
1792
|
+
### Π Π°Π±ΠΎΡΠ° ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈ Π΄Π°ΡΠ°ΠΌΠΈ
|
1793
|
+
|
1794
|
+
Sinatra ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊ `time_for`, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ· Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
|
1795
|
+
ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ Time. ΠΠ½ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ `DateTime`, `Date` ΠΈ
|
1796
|
+
ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ:
|
1797
|
+
|
1798
|
+
```ruby
|
1799
|
+
get '/' do
|
1800
|
+
pass if Time.now > time_for('Dec 23, 2012')
|
1801
|
+
"still time"
|
1802
|
+
end
|
1803
|
+
```
|
1804
|
+
|
1805
|
+
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²Π½ΡΡΡΠΈ Sinatra ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ `expires`, `last_modified` ΠΈ
|
1806
|
+
ΠΈΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΌΠΈ. ΠΠΎΡΡΠΎΠΌΡ Π²Ρ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΡΡΠΈΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²,
|
1807
|
+
ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ² `time_for` Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ:
|
1808
|
+
|
1809
|
+
```ruby
|
1810
|
+
helpers do
|
1811
|
+
def time_for(value)
|
1812
|
+
case value
|
1813
|
+
when :yesterday then Time.now - 24*60*60
|
1814
|
+
when :tomorrow then Time.now + 24*60*60
|
1815
|
+
else super
|
1816
|
+
end
|
1817
|
+
end
|
1818
|
+
end
|
1819
|
+
|
1820
|
+
get '/' do
|
1821
|
+
last_modified :yesterday
|
1822
|
+
expires :tomorrow
|
1823
|
+
"hello"
|
1824
|
+
end
|
1825
|
+
```
|
1826
|
+
|
1827
|
+
### ΠΠΎΠΈΡΠΊ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ²
|
1828
|
+
|
1829
|
+
ΠΠ»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΈ ΠΈΡ
ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄
|
1830
|
+
`find_template`:
|
1831
|
+
|
1832
|
+
```ruby
|
1833
|
+
find_template settings.views, 'foo', Tilt[:haml] do |file|
|
1834
|
+
puts "could be #{file}"
|
1835
|
+
end
|
1836
|
+
```
|
1837
|
+
|
1838
|
+
ΠΡΠΎ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ. ΠΠ°ΡΠΎ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΡΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅
|
1839
|
+
ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ
|
1840
|
+
ΠΏΠΎΠΈΡΠΊΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ
|
1841
|
+
Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΉ Ρ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌΠΈ:
|
1842
|
+
|
1843
|
+
```ruby
|
1844
|
+
set :views, ['views', 'templates']
|
1845
|
+
|
1846
|
+
helpers do
|
1847
|
+
def find_template(views, name, engine, &block)
|
1848
|
+
Array(views).each { |v| super(v, name, engine, &block) }
|
1849
|
+
end
|
1850
|
+
end
|
1851
|
+
```
|
1852
|
+
|
1853
|
+
ΠΡΡΠ³ΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ°Π·Π½ΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Π΄Π»Ρ Π΄Π²ΠΈΠΆΠΊΠΎΠ²
|
1854
|
+
ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°:
|
1855
|
+
|
1856
|
+
```ruby
|
1857
|
+
set :views, :sass => 'views/sass', :haml => 'templates', :default => 'views'
|
1858
|
+
|
1859
|
+
helpers do
|
1860
|
+
def find_template(views, name, engine, &block)
|
1861
|
+
_, folder = views.detect { |k,v| engine == Tilt[k] }
|
1862
|
+
folder ||= views[:default]
|
1863
|
+
super(folder, name, engine, &block)
|
1864
|
+
end
|
1865
|
+
end
|
1866
|
+
```
|
1867
|
+
|
1868
|
+
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π»Π΅Π³ΠΊΠΎ Π²ΡΠ½Π΅ΡΡΠΈ ΡΡΠΎΡ ΠΊΠΎΠ΄ Π² ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΠΈΠΌ Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ!
|
1869
|
+
|
1870
|
+
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ `find_template` Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π»ΠΈ ΡΠ°ΠΉΠ» Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅,
|
1871
|
+
Π° Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π·Π°Π΄Π°Π½Π½ΡΠΉ Π±Π»ΠΎΠΊ Π΄Π»Ρ Π²ΡΠ΅Ρ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
ΠΏΡΡΠ΅ΠΉ. ΠΠ΅Π»ΠΎ ΡΡΡ Π½Π΅ Π²
|
1872
|
+
ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π΄Π΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ `render` Π²ΡΠ·ΠΎΠ²Π΅Ρ `break`, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΉΠ»
|
1873
|
+
Π½Π΅ Π±ΡΠ΄Π΅Ρ Π½Π°ΠΉΠ΄Π΅Π½. Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΈ ΠΌΠ΅ΡΡΠΎΠ½Π°Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² Π±ΡΠ΄Π΅Ρ Π·Π°ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ,
|
1874
|
+
Π΅ΡΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ Π½Π΅ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ (`set :environment,
|
1875
|
+
:development`). ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠΌΠ½ΠΈΡΡ ΠΎΠ± ΡΡΠΈΡ
Π½ΡΠ°Π½ΡΠ°Ρ
, Π΅ΡΠ»ΠΈ ΠΏΠΈΡΠΈΡΠ΅ ΠΏΠΎ-Π½Π°ΡΡΠΎΡΡΠ΅ΠΌΡ
|
1876
|
+
"ΡΡΠΌΠ°ΡΡΠ΅Π΄ΡΠΈΠΉ" ΠΌΠ΅ΡΠΎΠ΄.
|
1877
|
+
|
1878
|
+
## ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
|
1879
|
+
|
1880
|
+
ΠΡΠΎΡ Π±Π»ΠΎΠΊ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΏΡΠΈ ΡΡΠ°ΡΡΠ΅ Π² Π»ΡΠ±ΠΎΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ, ΡΠ΅ΠΆΠΈΠΌΠ΅
|
1881
|
+
(environment):
|
1882
|
+
|
1883
|
+
```ruby
|
1884
|
+
configure do
|
1885
|
+
# Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΎΠΏΡΠΈΠΈ
|
1886
|
+
set :option, 'value'
|
1887
|
+
|
1888
|
+
# ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΡΠΈΠΉ
|
1889
|
+
set :a => 1, :b => 2
|
1890
|
+
|
1891
|
+
# ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ `set :option, true`
|
1892
|
+
enable :option
|
1893
|
+
|
1894
|
+
# ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ `set :option, false`
|
1895
|
+
disable :option
|
1896
|
+
|
1897
|
+
# Ρ Π²Π°Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ "Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅" ΠΎΠΏΡΠΈΠΈ Ρ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ
|
1898
|
+
set(:css_dir) { File.join(views, 'css') }
|
1899
|
+
end
|
1900
|
+
```
|
1901
|
+
|
1902
|
+
ΠΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ (RACK_ENV ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ) `:production`:
|
1903
|
+
|
1904
|
+
```ruby
|
1905
|
+
configure :production do
|
1906
|
+
...
|
1907
|
+
end
|
1908
|
+
```
|
1909
|
+
|
1910
|
+
ΠΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ `:production` ΠΈΠ»ΠΈ `:test`:
|
1911
|
+
|
1912
|
+
```ruby
|
1913
|
+
configure :production, :test do
|
1914
|
+
...
|
1915
|
+
end
|
1916
|
+
```
|
1917
|
+
|
1918
|
+
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΠΈΠΌ ΠΎΠΏΡΠΈΡΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ `settings`:
|
1919
|
+
|
1920
|
+
```ruby
|
1921
|
+
configure do
|
1922
|
+
set :foo, 'bar'
|
1923
|
+
end
|
1924
|
+
|
1925
|
+
get '/' do
|
1926
|
+
settings.foo? # => true
|
1927
|
+
settings.foo # => 'bar'
|
1928
|
+
...
|
1929
|
+
end
|
1930
|
+
```
|
1931
|
+
|
1932
|
+
### ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π·Π°ΡΠΈΡΡ ΠΎΡ Π°ΡΠ°ΠΊ
|
1933
|
+
|
1934
|
+
Sinatra ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ
|
1935
|
+
[Rack::Protection](https://github.com/rkh/rack-protection#readme) Π΄Π»Ρ Π·Π°ΡΠΈΡΡ
|
1936
|
+
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΡ ΠΏΡΠΎΡΡΡΡ
Π°ΡΠ°ΠΊ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π»Π΅Π³ΠΊΠΎ Π²ΡΠΊΠ»ΡΡΠΈΡΡ ΡΡΡ Π·Π°ΡΠΈΡΡ (ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π΅Ρ
|
1937
|
+
Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠ΅Π·Π²ΡΡΠ°ΠΉΠ½ΠΎ ΡΡΠ·Π²ΠΈΠΌΡΠΌ):
|
1938
|
+
|
1939
|
+
```ruby
|
1940
|
+
disable :protection
|
1941
|
+
```
|
1942
|
+
|
1943
|
+
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΡΡΠΎΠ²Π΅Π½Ρ Π·Π°ΡΠΈΡΡ, ΠΏΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ Ρ
Π΅Ρ ΠΎΠΏΡΠΈΠΉ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ
|
1944
|
+
`protection`:
|
1945
|
+
|
1946
|
+
```ruby
|
1947
|
+
set :protection, :except => :path_traversal
|
1948
|
+
```
|
1949
|
+
|
1950
|
+
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΠ²Π½Π΅ΠΉ Π·Π°ΡΠΈΡΡ:
|
1951
|
+
|
1952
|
+
```ruby
|
1953
|
+
set :protection, :except => [:path_traversal, :session_hijacking]
|
1954
|
+
```
|
1955
|
+
|
1956
|
+
### ΠΠΎΡΡΡΠΏΠ½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ
|
1957
|
+
|
1958
|
+
<dl>
|
1959
|
+
<dt>absolute_redirects</dt>
|
1960
|
+
<dd>
|
1961
|
+
Π΅ΡΠ»ΠΈ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΎ, ΡΠΎ Sinatra Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΡΡ
|
1962
|
+
ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ RFC 2616 (HTTP
|
1963
|
+
1.1), ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ.
|
1964
|
+
</dd>
|
1965
|
+
<dd>
|
1966
|
+
ΠΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ ΡΡΡ ΠΎΠΏΡΠΈΡ, Π΅ΡΠ»ΠΈ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π·Π° ΠΎΠ±ΡΠ°ΡΠ½ΡΠΌ ΠΏΡΠΎΠΊΡΠΈ,
|
1967
|
+
ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΡΡΡΠΎΠ΅Π½ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΌΠ΅ΡΠΎΠ΄ <tt>url</tt> Π²ΡΠ΅
|
1968
|
+
ΡΠ°Π²Π½ΠΎ Π±ΡΠ΄Π΅Ρ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΠ΅ URL, Π΅ΡΠ»ΠΈ Π²Ρ Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΡΠ΅ <tt>false</tt>
|
1969
|
+
Π²ΡΠΎΡΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ.
|
1970
|
+
</dd>
|
1971
|
+
<dd>ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.</dd>
|
1972
|
+
|
1973
|
+
<dt>add_charsets</dt>
|
1974
|
+
<dd>
|
1975
|
+
mime-ΡΠΈΠΏΡ, ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ <tt>content_type</tt> Π±ΡΠ΄Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ
|
1976
|
+
ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ΅. ΠΠ°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊ ΡΡΠΎΠΉ ΠΎΠΏΡΠΈΠΈ
|
1977
|
+
Π²ΠΌΠ΅ΡΡΠΎ Π΅Π΅ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ: <tt>settings.add_charsets << "application/foobar"</tt>
|
1978
|
+
</dd>
|
1979
|
+
|
1980
|
+
<dt>app_file</dt>
|
1981
|
+
<dd>
|
1982
|
+
ΠΏΡΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΌΡ ΡΠ°ΠΉΠ»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π½Π°Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ
|
1983
|
+
Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΉ Ρ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌΠΈ ΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ,
|
1984
|
+
Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ
ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ².
|
1985
|
+
</dd>
|
1986
|
+
|
1987
|
+
<dt>bind</dt>
|
1988
|
+
<dd>
|
1989
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ IP-Π°Π΄ΡΠ΅Ρ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: 0.0.0.0). ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ
|
1990
|
+
Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ.
|
1991
|
+
</dd>
|
1992
|
+
|
1993
|
+
<dt>default_encoding</dt>
|
1994
|
+
<dd>ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ°, Π΅ΡΠ»ΠΈ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½Π° (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: <tt>"utf-8"</tt>).</dd>
|
1995
|
+
|
1996
|
+
<dt>dump_errors</dt>
|
1997
|
+
<dd>ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π² Π»ΠΎΠ³Π΅.</dd>
|
1998
|
+
|
1999
|
+
<dt>environment</dt>
|
2000
|
+
<dd>
|
2001
|
+
ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ <tt>ENV['RACK_ENV']</tt> ΠΈΠ»ΠΈ
|
2002
|
+
<tt>"development"</tt>, Π΅ΡΠ»ΠΈ <tt>ENV['RACK_ENV']</tt> Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Π°.
|
2003
|
+
</dd>
|
2004
|
+
|
2005
|
+
<dt>logging</dt>
|
2006
|
+
<dd>ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΠΎΠ³Π΅Ρ.</dd>
|
2007
|
+
|
2008
|
+
<dt>lock</dt>
|
2009
|
+
<dd>
|
2010
|
+
ΡΠΎΠ·Π΄Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ
|
2011
|
+
ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π² ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π² Ruby ΠΏΡΠΎΡΠ΅ΡΡΠ΅.
|
2012
|
+
</dd>
|
2013
|
+
<dd>
|
2014
|
+
ΠΠΊΠ»ΡΡΠ°ΠΉΡΠ΅, Π΅ΡΠ»ΠΈ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΠΎΡΠΎΠΊΠΎ-Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ (thread-safe).
|
2015
|
+
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.</dd>
|
2016
|
+
|
2017
|
+
<dt>method_override</dt>
|
2018
|
+
<dd>
|
2019
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ "ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠΉ" ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ <tt>_method</tt>, Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ
|
2020
|
+
PUT/DELETE ΡΠΎΡΠΌ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ°Ρ
, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ.
|
2021
|
+
</dd>
|
2022
|
+
|
2023
|
+
<dt>port</dt>
|
2024
|
+
<dd>
|
2025
|
+
ΠΏΠΎΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ΅ΡΠ²Π΅Ρ.
|
2026
|
+
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ.
|
2027
|
+
</dd>
|
2028
|
+
|
2029
|
+
<dt>prefixed_redirects</dt>
|
2030
|
+
<dd>
|
2031
|
+
Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΈΠ»ΠΈ Π½Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ <tt>request.script_name</tt> ΠΊ ΡΠ΅Π΄ΠΈΡΠ΅ΠΊΡΠ°ΠΌ, Π΅ΡΠ»ΠΈ Π½Π΅
|
2032
|
+
Π·Π°Π΄Π°Π½ Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΠΉ ΠΏΡΡΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, <tt>redirect '/foo'</tt> Π±ΡΠ΄Π΅Ρ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ
|
2033
|
+
ΠΊΠ°ΠΊ <tt>redirect to('/foo')</tt>. ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
|
2034
|
+
</dd>
|
2035
|
+
|
2036
|
+
<dt>protection</dt>
|
2037
|
+
<dd>Π²ΠΊΠ»ΡΡΠ΅Π½Π° ΠΈΠ»ΠΈ Π½Π΅Ρ Π·Π°ΡΠΈΡΠ° ΠΎΡ Π°ΡΠ°ΠΊ. Π‘ΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ΅ΠΊΡΠΈΡ Π²ΡΡΠ΅.</dd>
|
2038
|
+
|
2039
|
+
<dt>public_dir</dt>
|
2040
|
+
<dd>ΠΠ»ΠΈΠ°Ρ Π΄Π»Ρ <tt>public_folder</tt>.</dd>
|
2041
|
+
|
2042
|
+
<dt>public_folder</dt>
|
2043
|
+
<dd>
|
2044
|
+
ΠΏΡΡΡ ΠΊ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ, ΠΎΡΠΊΡΠ΄Π° Π±ΡΠ΄ΡΡ ΡΠ°Π·Π΄Π°Π²Π°ΡΡΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ.
|
2045
|
+
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½Π° ΡΠ°Π·Π΄Π°ΡΠ° ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ°ΠΉΠ»ΠΎΠ²
|
2046
|
+
(ΡΠΌ. ΠΎΠΏΡΠΈΡ <tt>static</tt> Π½ΠΈΠΆΠ΅).
|
2047
|
+
</dd>
|
2048
|
+
|
2049
|
+
<dt>reload_templates</dt>
|
2050
|
+
<dd>
|
2051
|
+
ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΠΈΠ»ΠΈ Π½Π΅Ρ ΡΠ°Π±Π»ΠΎΠ½Ρ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ Π·Π°ΠΏΡΠΎΡ. ΠΠΊΠ»ΡΡΠ΅Π½ΠΎ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅
|
2052
|
+
ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
|
2053
|
+
</dd>
|
2054
|
+
|
2055
|
+
<dt>root</dt>
|
2056
|
+
<dd>ΠΏΡΡΡ ΠΊ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°.</dd>
|
2057
|
+
|
2058
|
+
<dt>raise_errors</dt>
|
2059
|
+
<dd>
|
2060
|
+
Π²ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ (Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅).
|
2061
|
+
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ <tt>test</tt>.
|
2062
|
+
</dd>
|
2063
|
+
|
2064
|
+
<dt>run</dt>
|
2065
|
+
<dd>
|
2066
|
+
Π΅ΡΠ»ΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ, Sinatra Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅Ρ. ΠΠ΅
|
2067
|
+
Π²ΠΊΠ»ΡΡΠ°ΠΉΡΠ΅, Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ rackup ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π°.
|
2068
|
+
</dd>
|
2069
|
+
|
2070
|
+
<dt>running</dt>
|
2071
|
+
<dd>ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π»ΠΈ ΡΠ΅ΠΉΡΠ°Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ? ΠΠ΅ ΠΌΠ΅Π½ΡΠΉΡΠ΅ ΡΡΡ ΠΎΠΏΡΠΈΡ!</dd>
|
2072
|
+
|
2073
|
+
<dt>server</dt>
|
2074
|
+
<dd>
|
2075
|
+
ΡΠ΅ΡΠ²Π΅Ρ ΠΈΠ»ΠΈ ΡΠΏΠΈΡΠΎΠΊ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅
|
2076
|
+
Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: <tt>['thin', 'mongrel', 'webrick']</tt>, ΠΏΠΎΡΡΠ΄ΠΎΠΊ
|
2077
|
+
Π·Π°Π΄Π°Π΅Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ.</dd>
|
2078
|
+
|
2079
|
+
<dt>sessions</dt>
|
2080
|
+
<dd>
|
2081
|
+
Π²ΠΊΠ»ΡΡΠΈΡΡ ΡΠ΅ΡΡΠΈΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΡΠΊ (cookie) Π½Π° Π±Π°Π·Π΅ <tt>Rack::Session::Cookie</tt>.
|
2082
|
+
Π‘ΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ΅ΠΊΡΠΈΡ "ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΈΠΉ" Π²ΡΡΠ΅.
|
2083
|
+
</dd>
|
2084
|
+
|
2085
|
+
<dt>show_exceptions</dt>
|
2086
|
+
<dd>
|
2087
|
+
ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ/ΡΡΠ΅ΠΊ Π²ΡΠ·ΠΎΠ²ΠΎΠ² (stack trace) Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
|
2088
|
+
Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ <tt>development</tt>.
|
2089
|
+
</dd>
|
2090
|
+
<dd>
|
2091
|
+
ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π²
|
2092
|
+
<tt>:after_handler</tt> Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΎΠΉ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ,
|
2093
|
+
ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠΎΠΊΠ°Π·ΠΎΠΌ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅ΠΊΠ° Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅.
|
2094
|
+
</dd>
|
2095
|
+
|
2096
|
+
<dt>static</dt>
|
2097
|
+
<dd>Π΄ΠΎΠ»ΠΆΠ½Π° Π»ΠΈ Sinatra ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΡΠ°Π·Π΄Π°ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ°ΠΉΠ»ΠΎΠ².</dd>
|
2098
|
+
<dd>ΠΡΠΊΠ»ΡΡΠΈΡΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅Ρ Π΄Π»Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ.</dd>
|
2099
|
+
<dd>ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ»ΡΡΡΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.</dd>
|
2100
|
+
<dd>ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ Π² ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΈ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΎ Π² ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
.</dd>
|
2101
|
+
|
2102
|
+
<dt>static_cache_control</dt>
|
2103
|
+
<dd>
|
2104
|
+
ΠΊΠΎΠ³Π΄Π° Sinatra ΠΎΡΠ΄Π°Π΅Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΡ ΠΎΠΏΡΠΈΡ, ΡΡΠΎΠ±Ρ
|
2105
|
+
Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΈΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ <tt>Cache-Control</tt>. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ
|
2106
|
+
ΠΌΠ΅ΡΠΎΠ΄-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊ <tt>cache_control</tt>. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΎ.
|
2107
|
+
</dd>
|
2108
|
+
<dd>
|
2109
|
+
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΌΠ°ΡΡΠΈΠ², ΠΊΠΎΠ³Π΄Π° Π½Π°Π΄ΠΎ Π·Π°Π΄Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ:
|
2110
|
+
<tt>set :static_cache_control, [:public, :max_age => 300]</tt>
|
2111
|
+
</dd>
|
2112
|
+
|
2113
|
+
<dt>threaded</dt>
|
2114
|
+
<dd>
|
2115
|
+
Π΅ΡΠ»ΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ, ΡΠΎ Thin Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ <tt>EventMachine.defer</tt> Π΄Π»Ρ
|
2116
|
+
ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ².
|
2117
|
+
</dd>
|
2118
|
+
|
2119
|
+
<dt>traps</dt>
|
2120
|
+
<dd>Π΄ΠΎΠ»ΠΆΠ½Π° Π»ΠΈ Π‘ΠΈΠ½Π°ΡΡΠ° ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ ΠΈΠ»ΠΈ Π½Π΅Ρ.</tt></dd>
|
2121
|
+
|
2122
|
+
<dt>views</dt>
|
2123
|
+
<dd>ΠΏΡΡΡ ΠΊ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Ρ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌΠΈ.</dd>
|
2124
|
+
</dl>
|
2125
|
+
|
2126
|
+
## Π Π΅ΠΆΠΈΠΌ, ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅
|
2127
|
+
|
2128
|
+
ΠΡΡΡ 3 ΠΏΡΠ΅Π΄ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ
ΡΠ΅ΠΆΠΈΠΌΠ°, ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ: `"development"`, `"production"` ΠΈ
|
2129
|
+
`"test"`. Π Π΅ΠΆΠΈΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°Π΄Π°Π½ ΡΠ΅ΡΠ΅Π· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ `RACK_ENV`.
|
2130
|
+
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ β `"development"`. Π ΡΡΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ°Π±ΠΎΡΡ Π²ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Ρ
|
2131
|
+
ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ. Π ΡΠ°ΠΊΠΆΠ΅ Π·Π°Π΄Π°ΡΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ
|
2132
|
+
`not_found` ΠΈ `error`, ΡΡΠΎΠ±Ρ Π²Ρ ΠΌΠΎΠ³Π»ΠΈ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΡΠ΅ΠΊ Π²ΡΠ·ΠΎΠ²ΠΎΠ². Π ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡΡ
|
2133
|
+
`"production"` ΠΈ `"test"` ΡΠ°Π±Π»ΠΎΠ½Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΊΡΡΠΈΡΡΡΡΡΡ.
|
2134
|
+
|
2135
|
+
ΠΠ»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠ»ΡΡ `-e`
|
2136
|
+
|
2137
|
+
```
|
2138
|
+
ruby my_app.rb -e [ENVIRONMENT]
|
2139
|
+
```
|
2140
|
+
|
2141
|
+
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅Π΄ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ `development?`, `test?` ΠΈ
|
2142
|
+
+production?, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅.
|
2143
|
+
|
2144
|
+
## ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ
|
2145
|
+
|
2146
|
+
ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅, ΡΡΠΎ ΠΈ ΠΌΠ°ΡΡΡΡΡΡ, ΠΈ
|
2147
|
+
`before`-ΡΠΈΠ»ΡΡΡΡ, Π° ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π²ΡΡΠΊΠΈΠ΅ ΠΏΡΠ΅Π»Π΅ΡΡΠΈ Π²ΡΠΎΠ΄Π΅ `haml`, `erb`,
|
2148
|
+
`halt` ΠΈ Ρ.Π΄. Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΈ ΠΈΠΌ.
|
2149
|
+
|
2150
|
+
### Not Found
|
2151
|
+
|
2152
|
+
ΠΠΎΠ³Π΄Π° Π²ΡΠ±ΡΠΎΡΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ `Sinatra::NotFound`, ΠΈΠ»ΠΈ ΠΊΠΎΠ΄ΠΎΠΌ ΠΎΡΠ²Π΅ΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ 404,
|
2153
|
+
ΡΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ `not_found` ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ:
|
2154
|
+
|
2155
|
+
```ruby
|
2156
|
+
not_found do
|
2157
|
+
'This is nowhere to be found.'
|
2158
|
+
end
|
2159
|
+
```
|
2160
|
+
|
2161
|
+
### ΠΡΠΈΠ±ΠΊΠΈ
|
2162
|
+
|
2163
|
+
ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΎΡΠΈΠ±ΠΎΠΊ `error` Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠΎΡΠ΅Π½ΠΎ ΠΈΠ· Π±Π»ΠΎΠΊΠ°
|
2164
|
+
ΠΌΠ°ΡΡΡΡΡΠ°, Π»ΠΈΠ±ΠΎ ΠΈΠ· ΡΠΈΠ»ΡΡΡΠ°. ΠΠ±ΡΠ΅ΠΊΡ-ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ
|
2165
|
+
`sinatra.error` Π² Rack:
|
2166
|
+
|
2167
|
+
```ruby
|
2168
|
+
error do
|
2169
|
+
'Sorry there was a nasty error - ' + env['sinatra.error'].name
|
2170
|
+
end
|
2171
|
+
```
|
2172
|
+
|
2173
|
+
ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ:
|
2174
|
+
|
2175
|
+
```ruby
|
2176
|
+
error MyCustomError do
|
2177
|
+
'So what happened was...' + env['sinatra.error'].message
|
2178
|
+
end
|
2179
|
+
```
|
2180
|
+
|
2181
|
+
Π’ΠΎΠ³Π΄Π°, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ:
|
2182
|
+
|
2183
|
+
```ruby
|
2184
|
+
get '/' do
|
2185
|
+
raise MyCustomError, 'something bad'
|
2186
|
+
end
|
2187
|
+
```
|
2188
|
+
|
2189
|
+
Π’ΠΎ Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅:
|
2190
|
+
|
2191
|
+
```
|
2192
|
+
So what happened was... something bad
|
2193
|
+
```
|
2194
|
+
|
2195
|
+
Π’Π°ΠΊΠΆΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΎΡΠΈΠ±ΠΎΠΊ Π΄Π»Ρ ΠΊΠΎΠ΄Π° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ HTTP:
|
2196
|
+
|
2197
|
+
```ruby
|
2198
|
+
error 403 do
|
2199
|
+
'Access forbidden'
|
2200
|
+
end
|
2201
|
+
|
2202
|
+
get '/secret' do
|
2203
|
+
403
|
2204
|
+
end
|
2205
|
+
```
|
2206
|
+
|
2207
|
+
ΠΠΈΠ±ΠΎ Π½Π°Π±ΠΎΡΠ° ΠΊΠΎΠ΄ΠΎΠ²:
|
2208
|
+
|
2209
|
+
```ruby
|
2210
|
+
error 400..510 do
|
2211
|
+
'Boom'
|
2212
|
+
end
|
2213
|
+
```
|
2214
|
+
|
2215
|
+
Sinatra ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ `not_found` ΠΈ `error` ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ, ΠΊΠΎΠ³Π΄Π°
|
2216
|
+
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ (ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ `:development`).
|
2217
|
+
|
2218
|
+
## Rack "ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΠΈ"
|
2219
|
+
|
2220
|
+
Sinatra ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ [Rack](http://rack.rubyforge.org/), ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ
|
2221
|
+
ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ Π²Π΅Π±-ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠ² Π½Π° Ruby. ΠΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ°ΠΌΡΡ
ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ
Π΄Π»Ρ
|
2222
|
+
ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ Rack ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° "ΠΏΡΠΎΡΠ»ΠΎΠ΅ΠΊ" ("middleware") β
|
2223
|
+
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², Π½Π°Ρ
ΠΎΠ΄ΡΡΠΈΡ
ΡΡ "ΠΌΠ΅ΠΆΠ΄Ρ" ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΠΈ Π²Π°ΡΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅
|
2224
|
+
ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΈ/ΠΈΠ»ΠΈ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΡΡΡ HTTP Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ/ΠΎΡΠ²Π΅ΡΠ°ΠΌΠΈ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ
|
2225
|
+
ΡΠ°Π·Π»ΠΈΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ.
|
2226
|
+
|
2227
|
+
Π Sinatra ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΠΈΠ΅ "ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΠΈ" Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° `use`:
|
2228
|
+
|
2229
|
+
```ruby
|
2230
|
+
require 'sinatra'
|
2231
|
+
require 'my_custom_middleware'
|
2232
|
+
|
2233
|
+
use Rack::Lint
|
2234
|
+
use MyCustomMiddleware
|
2235
|
+
|
2236
|
+
get '/hello' do
|
2237
|
+
'Hello World'
|
2238
|
+
end
|
2239
|
+
```
|
2240
|
+
|
2241
|
+
Π‘Π΅ΠΌΠ°Π½ΡΠΈΠΊΠ° `use` ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½Π° ΡΠΎΠΉ, ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π΄Π»Ρ
|
2242
|
+
[Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html) DSL
|
2243
|
+
(ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² rackup ΡΠ°ΠΉΠ»Π°Ρ
). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ΅ΡΠΎΠ΄ `use` ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΊΠ°ΠΊ
|
2244
|
+
ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΡΠ°ΠΊ ΠΈ Π±Π»ΠΎΠΊΠΈ:
|
2245
|
+
|
2246
|
+
```ruby
|
2247
|
+
use Rack::Auth::Basic do |username, password|
|
2248
|
+
username == 'admin' && password == 'secret'
|
2249
|
+
end
|
2250
|
+
```
|
2251
|
+
|
2252
|
+
Rack ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΡΡΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌΠΈ "ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΠ°ΠΌΠΈ" Π΄Π»Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ,
|
2253
|
+
ΠΎΡΠ»Π°Π΄ΠΊΠΈ, ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΠΈ URL, Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ΅ΡΡΠΈΠΉ. Sinatra
|
2254
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΡΡΠΈΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ, ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡΡ Π½Π°
|
2255
|
+
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΡΡΠΎΠ±Ρ Π²Π°ΠΌ Π½Π΅ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΠ»ΠΎΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡ (`use`) ΠΈΡ
Π²ΡΡΡΠ½ΡΡ.
|
2256
|
+
|
2257
|
+
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΠΈ Π²
|
2258
|
+
[rack](https://github.com/rack/rack/tree/master/lib/rack),
|
2259
|
+
[rack-contrib](https://github.com/rack/rack-contrib#readme),
|
2260
|
+
ΠΈΠ»ΠΈ Π²
|
2261
|
+
[Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware).
|
2262
|
+
|
2263
|
+
## Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
|
2264
|
+
|
2265
|
+
Π’Π΅ΡΡΡ Π΄Π»Ρ Sinatra ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π½Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ,
|
2266
|
+
ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠ², ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΡ
ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Rack.
|
2267
|
+
[Rack::Test](http://rdoc.info/github/brynary/rack-test/master/frames)
|
2268
|
+
ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½:
|
2269
|
+
|
2270
|
+
```ruby
|
2271
|
+
require 'my_sinatra_app'
|
2272
|
+
require 'test/unit'
|
2273
|
+
require 'rack/test'
|
2274
|
+
|
2275
|
+
class MyAppTest < Test::Unit::TestCase
|
2276
|
+
include Rack::Test::Methods
|
2277
|
+
|
2278
|
+
def app
|
2279
|
+
Sinatra::Application
|
2280
|
+
end
|
2281
|
+
|
2282
|
+
def test_my_default
|
2283
|
+
get '/'
|
2284
|
+
assert_equal 'Hello World!', last_response.body
|
2285
|
+
end
|
2286
|
+
|
2287
|
+
def test_with_params
|
2288
|
+
get '/meet', :name => 'Frank'
|
2289
|
+
assert_equal 'Hello Frank!', last_response.body
|
2290
|
+
end
|
2291
|
+
|
2292
|
+
def test_with_rack_env
|
2293
|
+
get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
|
2294
|
+
assert_equal "You're using Songbird!", last_response.body
|
2295
|
+
end
|
2296
|
+
end
|
2297
|
+
```
|
2298
|
+
|
2299
|
+
## Sinatra::Base β "ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΠΈ", Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
|
2300
|
+
|
2301
|
+
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ°ΠΌΡΠΌ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ (Ρ ΠΏΠΎΠΌΠΎΡΡΡ DSL Π²Π΅ΡΡ
Π½Π΅Π³ΠΎ
|
2302
|
+
ΡΡΠΎΠ²Π½Ρ, ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΡΠΈΠ»Ρ) ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π»Ρ ΠΊΡΠΎΡ
ΠΎΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π ΡΠ°ΠΊΠΈΡ
|
2303
|
+
ΡΠ»ΡΡΠ°ΡΡ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΡΠ°ΡΡΡΠΈΡΠ°Π½Π½Π°Ρ Π½Π° ΠΌΠΈΠΊΡΠΎ-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
|
2304
|
+
(Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, `./public` ΠΈ `./views` Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ, Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅,
|
2305
|
+
ΡΡΡΠ°Π½ΠΈΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ± ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΈ Ρ.Π΄.). Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΡΠ°ΠΊΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ
|
2306
|
+
ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠ² ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ Rack middleware
|
2307
|
+
("ΠΏΡΠΎΡΠ»ΠΎΠ΅ΠΊ"), Rails metal, ΠΏΡΠΎΡΡΡΡ
Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ Ρ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ,
|
2308
|
+
ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ Sinatra. Π ΡΡΡ Π½Π° ΠΏΠΎΠΌΠΎΡΡ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡ `Sinatra::Base`:
|
2309
|
+
|
2310
|
+
```ruby
|
2311
|
+
require 'sinatra/base'
|
2312
|
+
|
2313
|
+
class MyApp < Sinatra::Base
|
2314
|
+
set :sessions, true
|
2315
|
+
set :foo, 'bar'
|
2316
|
+
|
2317
|
+
get '/' do
|
2318
|
+
'Hello world!'
|
2319
|
+
end
|
2320
|
+
end
|
2321
|
+
```
|
2322
|
+
|
2323
|
+
ΠΠ΅ΡΠΎΠ΄Ρ, Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ `Sinatra::Base` ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ°ΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Π΄ΠΎΡΡΡΠΏΠ½Ρ
|
2324
|
+
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ Π² DSL Π²Π΅ΡΡ
Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ. ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΠ°ΠΊΠΈΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ
|
2325
|
+
ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°Π½Ρ Π² `Sinatra::Base` ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π²ΡΡ
ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΉ:
|
2326
|
+
|
2327
|
+
* ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡ `sinatra/base` Π²ΠΌΠ΅ΡΡΠΎ `sinatra`, ΠΈΠ½Π°ΡΠ΅ Π²ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ,
|
2328
|
+
ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠ΅ Sinatra, Π±ΡΠ΄ΡΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Ρ Π² Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ
|
2329
|
+
ΠΈΠΌΠ΅Π½.
|
2330
|
+
* ΠΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ Π²ΡΠ΅ ΠΌΠ°ΡΡΡΡΡΡ, ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ, ΡΠΈΠ»ΡΡΡΡ ΠΈ ΠΎΠΏΡΠΈΠΈ Π² ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ
|
2331
|
+
`Sinatra::Base`.
|
2332
|
+
|
2333
|
+
`Sinatra::Base` β ΡΡΠΎ ΡΠΈΡΡΡΠΉ Π»ΠΈΡΡ. ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΎΠΏΡΠΈΠΉ, Π²ΠΊΠ»ΡΡΠ°Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ
|
2334
|
+
ΡΠ΅ΡΠ²Π΅Ρ, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΡΠΊΠ»ΡΡΠ΅Π½Ρ. Π‘ΠΌΠΎΡΡΠΈΡΠ΅
|
2335
|
+
[ΠΠΏΡΠΈΠΈ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ](http://www.sinatrarb.com/configuration.html)
|
2336
|
+
Π΄Π»Ρ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ± ΠΎΠΏΡΠΈΡΡ
ΠΈ ΠΈΡ
ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ.
|
2337
|
+
|
2338
|
+
### ΠΠΎΠ΄ΡΠ»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠΈΠ² ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ
|
2339
|
+
|
2340
|
+
ΠΠΎΠΏΡΠ΅ΠΊΠΈ Π²ΡΠ΅ΠΎΠ±ΡΠ΅ΠΌΡ ΡΠ±Π΅ΠΆΠ΄Π΅Π½ΠΈΡ, Π² ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΡΡΠΈΠ»Π΅ (ΡΠ°ΠΌΠΎΠΌ ΠΏΡΠΎΡΡΠΎΠΌ) Π½Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ
|
2341
|
+
ΠΏΠ»ΠΎΡ
ΠΎΠ³ΠΎ. ΠΡΠ»ΠΈ ΡΡΠΎΡ ΡΡΠΈΠ»Ρ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π²Π°ΡΠ΅ΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π²Ρ Π½Π΅ ΠΎΠ±ΡΠ·Π°Π½Ρ
|
2342
|
+
ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°ΡΡ Π΅Π³ΠΎ Π² ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
|
2343
|
+
|
2344
|
+
ΠΡΠ½ΠΎΠ²Π½ΡΠΌ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠΌ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΡΠΈΠ»Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ Ρ Π²Π°Ρ ΠΌΠΎΠΆΠ΅Ρ
|
2345
|
+
Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Sinatra Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅ΡΡ Ruby. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΠ΅
|
2346
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅, ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ΡΡ Π½Π° ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠΉ ΡΡΠΈΠ»Ρ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΌΠ΅Π»ΠΎ
|
2347
|
+
ΡΠΌΠ΅ΡΠΈΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠΉ ΠΈ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΡΠΈΠ»ΠΈ.
|
2348
|
+
|
2349
|
+
ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄Ρ Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΡΠΈΠ»Ρ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ, ΠΏΡΠΈΠΌΠΈΡΠ΅ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²
|
2350
|
+
Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
:
|
2351
|
+
|
2352
|
+
ΠΠΏΡΠΈΡ ΠΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΠΎΠ΄ΡΠ»ΡΠ½ΡΠΉ
|
2353
|
+
|
2354
|
+
app_file ΡΠ°ΠΉΠ» Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ°ΠΉΠ» Ρ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠΎΠΌ Sinatra::Base
|
2355
|
+
run $0 == app_file false
|
2356
|
+
logging true false
|
2357
|
+
method_override true false
|
2358
|
+
inline_templates true false
|
2359
|
+
static true false
|
2360
|
+
|
2361
|
+
### ΠΠ°ΠΏΡΡΠΊ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
|
2362
|
+
|
2363
|
+
ΠΡΡΡ Π΄Π²Π° ΠΎΠ±ΡΠ΅ΠΏΡΠΈΠ½ΡΡΡΡ
ΡΠΏΠΎΡΠΎΠ±Π° Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: Π·Π°ΠΏΡΡΠΊ Π½Π°ΠΏΡΡΠΌΡΡ
|
2364
|
+
Ρ ΠΏΠΎΠΌΠΎΡΡΡ `run!`:
|
2365
|
+
|
2366
|
+
```ruby
|
2367
|
+
# my_app.rb
|
2368
|
+
require 'sinatra/base'
|
2369
|
+
|
2370
|
+
class MyApp < Sinatra::Base
|
2371
|
+
# ... Π·Π΄Π΅ΡΡ ΠΊΠΎΠ΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ...
|
2372
|
+
|
2373
|
+
# Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠ΅ΡΠ²Π΅Ρ, Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΠ°ΠΉΠ»
|
2374
|
+
run! if app_file == $0
|
2375
|
+
end
|
2376
|
+
```
|
2377
|
+
|
2378
|
+
ΠΠ°ΡΠ΅ΠΌ:
|
2379
|
+
|
2380
|
+
```
|
2381
|
+
ruby my_app.rb
|
2382
|
+
```
|
2383
|
+
|
2384
|
+
ΠΠ»ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° `config.ru`, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ
|
2385
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠΉ Rack-ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
|
2386
|
+
|
2387
|
+
```ruby
|
2388
|
+
# config.ru
|
2389
|
+
require './my_app'
|
2390
|
+
run MyApp
|
2391
|
+
```
|
2392
|
+
|
2393
|
+
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ:
|
2394
|
+
|
2395
|
+
```
|
2396
|
+
rackup -p 4567
|
2397
|
+
```
|
2398
|
+
|
2399
|
+
### ΠΠ°ΠΏΡΡΠΊ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ config.ru
|
2400
|
+
|
2401
|
+
Π€Π°ΠΉΠ» ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
|
2402
|
+
|
2403
|
+
```ruby
|
2404
|
+
# app.rb
|
2405
|
+
require 'sinatra'
|
2406
|
+
|
2407
|
+
get '/' do
|
2408
|
+
'Hello world!'
|
2409
|
+
end
|
2410
|
+
```
|
2411
|
+
|
2412
|
+
Π ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ `config.ru`:
|
2413
|
+
|
2414
|
+
```ruby
|
2415
|
+
require './app'
|
2416
|
+
run Sinatra::Application
|
2417
|
+
```
|
2418
|
+
|
2419
|
+
### ΠΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ config.ru?
|
2420
|
+
|
2421
|
+
ΠΠΎΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΡΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ Π²Ρ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
|
2422
|
+
`config.ru`:
|
2423
|
+
|
2424
|
+
* Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡ ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Rack-ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΡ
|
2425
|
+
ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ
(Passenger, Unicorn, Heroku, ...);
|
2426
|
+
* Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ° `Sinatra::Base`;
|
2427
|
+
* Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Sinatra ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ "ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΠΈ" Rack.
|
2428
|
+
|
2429
|
+
**Π‘ΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡΡ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ `config.ru` Π»ΠΈΡΡ ΠΏΠΎΡΠΎΠΌΡ,
|
2430
|
+
ΡΡΠΎ Π²Ρ ΡΡΠ°Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠΉ ΡΡΠΈΠ»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ
|
2431
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠΉ ΡΡΠΈΠ»Ρ, ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
|
2432
|
+
`config.ru`.**
|
2433
|
+
|
2434
|
+
### ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Sinatra Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ "ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΠΈ"
|
2435
|
+
|
2436
|
+
ΠΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΌΠ° Sinatra ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ "ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΠΈ" Rack, Π½ΠΎ ΠΈ Π»ΡΠ±ΠΎΠ΅ Sinatra
|
2437
|
+
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΌΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΊ Π»ΡΠ±ΠΎΠΌΡ Rack endpoint Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅
|
2438
|
+
"ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΠΈ". ΠΡΠΈΠΌ endpoint (ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΎΠΉ) ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΡΡΠ³ΠΎΠ΅ Sinatra
|
2439
|
+
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π½Π° Rack (Rails/Ramaze/Camping/...):
|
2440
|
+
|
2441
|
+
```ruby
|
2442
|
+
require 'sinatra/base'
|
2443
|
+
|
2444
|
+
class LoginScreen < Sinatra::Base
|
2445
|
+
enable :sessions
|
2446
|
+
|
2447
|
+
get('/login') { haml :login }
|
2448
|
+
|
2449
|
+
post('/login') do
|
2450
|
+
if params[:name] == 'admin' && params[:password] == 'admin'
|
2451
|
+
session['user_name'] = params[:name]
|
2452
|
+
else
|
2453
|
+
redirect '/login'
|
2454
|
+
end
|
2455
|
+
end
|
2456
|
+
end
|
2457
|
+
|
2458
|
+
class MyApp < Sinatra::Base
|
2459
|
+
# "ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΠ°" Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½Π° ΠΏΠ΅ΡΠ΅Π΄ ΡΠΈΠ»ΡΡΡΠ°ΠΌΠΈ
|
2460
|
+
use LoginScreen
|
2461
|
+
|
2462
|
+
before do
|
2463
|
+
unless session['user_name']
|
2464
|
+
halt "Access denied, please <a href='/login'>login</a>."
|
2465
|
+
end
|
2466
|
+
end
|
2467
|
+
|
2468
|
+
get('/') { "Hello #{session['user_name']}." }
|
2469
|
+
end
|
2470
|
+
```
|
2471
|
+
|
2472
|
+
### Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ "Π½Π° Π»Π΅ΡΡ"
|
2473
|
+
|
2474
|
+
ΠΠ½ΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Sinatra ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ "Π½Π° Π»Π΅ΡΡ" (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ
|
2475
|
+
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ). ΠΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ `Sinatra.new`:
|
2476
|
+
|
2477
|
+
```ruby
|
2478
|
+
require 'sinatra/base'
|
2479
|
+
my_app = Sinatra.new { get('/') { "hi" } }
|
2480
|
+
my_app.run!
|
2481
|
+
```
|
2482
|
+
|
2483
|
+
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΎΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ
|
2484
|
+
Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡΡΡ:
|
2485
|
+
|
2486
|
+
```ruby
|
2487
|
+
# config.ru
|
2488
|
+
require 'sinatra/base'
|
2489
|
+
|
2490
|
+
controller = Sinatra.new do
|
2491
|
+
enable :logging
|
2492
|
+
helpers MyHelpers
|
2493
|
+
end
|
2494
|
+
|
2495
|
+
map('/a') do
|
2496
|
+
run Sinatra.new(controller) { get('/') { 'a' } }
|
2497
|
+
end
|
2498
|
+
|
2499
|
+
map('/b') do
|
2500
|
+
run Sinatra.new(controller) { get('/') { 'b' } }
|
2501
|
+
end
|
2502
|
+
```
|
2503
|
+
|
2504
|
+
ΠΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ Sinatra ΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ
|
2505
|
+
Sinatra Π²Π½ΡΡΡΠΈ Π²Π°ΡΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
|
2506
|
+
|
2507
|
+
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Sinatra ΠΊΠ°ΠΊ "ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΡ" ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ:
|
2508
|
+
|
2509
|
+
```ruby
|
2510
|
+
require 'sinatra/base'
|
2511
|
+
|
2512
|
+
use Sinatra do
|
2513
|
+
get('/') { ... }
|
2514
|
+
end
|
2515
|
+
|
2516
|
+
run RailsProject::Application
|
2517
|
+
```
|
2518
|
+
|
2519
|
+
## ΠΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ°
|
2520
|
+
|
2521
|
+
Π’Π΅ΠΊΡΡΠ°Ρ ΠΎΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π² Π΄Π°Π½Π½ΡΠΉ
|
2522
|
+
ΠΌΠΎΠΌΠ΅Π½Ρ.
|
2523
|
+
|
2524
|
+
### ΠΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ / ΠΊΠ»Π°ΡΡΠ°
|
2525
|
+
|
2526
|
+
ΠΡΠ±ΠΎΠ΅ Sinatra ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΡ `Sinatra::Base`. ΠΡΠ»ΠΈ Π²Ρ
|
2527
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ DSL Π²Π΅ΡΡ
Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ (`require 'sinatra'`), ΡΠΎ ΡΡΠΈΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ
|
2528
|
+
`Sinatra::Application`, ΠΈΠ½Π°ΡΠ΅ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΡΠΎΠ·Π΄Π°Π»ΠΈ Π²ΡΡΡΠ½ΡΡ.
|
2529
|
+
ΠΠ° ΡΡΠΎΠ²Π½Π΅ ΠΊΠ»Π°ΡΡΠ° Π²Π°ΠΌ Π±ΡΠ΄ΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠ°ΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠ°ΠΊ `get` ΠΈΠ»ΠΈ `before`, Π½ΠΎ
|
2530
|
+
Π²Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ `request` ΠΈΠ»ΠΈ `session`, ΡΠ°ΠΊ ΠΊΠ°ΠΊ
|
2531
|
+
ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΊΠ»Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ Π²ΡΠ΅Ρ
Π·Π°ΠΏΡΠΎΡΠΎΠ².
|
2532
|
+
|
2533
|
+
ΠΠΏΡΠΈΠΈ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ `set`, ΡΠ²Π»ΡΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ ΡΡΠΎΠ²Π½Ρ ΠΊΠ»Π°ΡΡΠ°:
|
2534
|
+
|
2535
|
+
```ruby
|
2536
|
+
class MyApp < Sinatra::Base
|
2537
|
+
# Π― Π² ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ!
|
2538
|
+
set :foo, 42
|
2539
|
+
foo # => 42
|
2540
|
+
|
2541
|
+
get '/foo' do
|
2542
|
+
# Π― Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π² ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ!
|
2543
|
+
end
|
2544
|
+
end
|
2545
|
+
```
|
2546
|
+
|
2547
|
+
Π£ Π²Π°Ρ Π±ΡΠ΄Π΅Ρ ΠΎΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²Π½ΡΡΡΠΈ:
|
2548
|
+
|
2549
|
+
* ΡΠ΅Π»Π° Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ;
|
2550
|
+
* ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ
ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ;
|
2551
|
+
* Π±Π»ΠΎΠΊΠ°, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π² `helpers`;
|
2552
|
+
* Π±Π»ΠΎΠΊΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΡΡ
ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ `set`;
|
2553
|
+
* Π±Π»ΠΎΠΊΠ°, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π² `Sinatra.new`.
|
2554
|
+
|
2555
|
+
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ (ΠΊΠ»Π°ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ)
|
2556
|
+
ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ:
|
2557
|
+
|
2558
|
+
* ΡΠ΅ΡΠ΅Π· ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΉ Π±Π»ΠΎΠΊΠ°ΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ (`configure { |c| ... }`);
|
2559
|
+
* `settings` Π²Π½ΡΡΡΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°ΠΏΡΠΎΡΠ°.
|
2560
|
+
|
2561
|
+
### ΠΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°ΠΏΡΠΎΡΠ°/ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°
|
2562
|
+
|
2563
|
+
ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ
ΠΎΠ΄ΡΡΠ΅Π³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ Π½ΠΎΠ²ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ,
|
2564
|
+
ΠΈ Π²ΡΠ΅ Π±Π»ΠΎΠΊΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π±ΡΠ΄ΡΡ Π·Π°ΠΏΡΡΠ΅Π½Ρ Π² ΡΡΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅. Π ΡΡΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ
|
2565
|
+
Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²Π°ΠΌ Π΄ΠΎΡΡΡΠΏΠ½Ρ `request` ΠΈ `session` ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π²ΡΠ·ΠΎΠ²Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²
|
2566
|
+
ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ `erb` ΠΈΠ»ΠΈ `haml`. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠ±Π»Π°ΡΡΠΈ
|
2567
|
+
Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π·Π°ΠΏΡΠΎΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΌΠ΅ΡΠΎΠ΄-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊ
|
2568
|
+
`settings`:
|
2569
|
+
|
2570
|
+
```ruby
|
2571
|
+
class MyApp < Sinatra::Base
|
2572
|
+
# Π― Π² ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ!
|
2573
|
+
get '/define_route/:name' do
|
2574
|
+
# ΠΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°ΠΏΡΠΎΡΠ° '/define_route/:name'
|
2575
|
+
@value = 42
|
2576
|
+
|
2577
|
+
settings.get("/#{params[:name]}") do
|
2578
|
+
# ΠΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°ΠΏΡΠΎΡΠ° "/#{params[:name]}"
|
2579
|
+
@value # => nil (Π΄ΡΡΠ³ΠΎΠΉ Π·Π°ΠΏΡΠΎΡ)
|
2580
|
+
end
|
2581
|
+
|
2582
|
+
"Route defined!"
|
2583
|
+
end
|
2584
|
+
end
|
2585
|
+
```
|
2586
|
+
|
2587
|
+
Π£ Π²Π°Ρ Π±ΡΠ΄Π΅Ρ ΠΎΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°ΠΏΡΠΎΡΠ° Π²:
|
2588
|
+
|
2589
|
+
* get/head/post/put/delete/options Π±Π»ΠΎΠΊΠ°Ρ
;
|
2590
|
+
* before/after ΡΠΈΠ»ΡΡΡΠ°Ρ
;
|
2591
|
+
* ΠΌΠ΅ΡΠΎΠ΄Π°Ρ
-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠ°Ρ
;
|
2592
|
+
* ΡΠ°Π±Π»ΠΎΠ½Π°Ρ
/ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡ
.
|
2593
|
+
|
2594
|
+
### ΠΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ
|
2595
|
+
|
2596
|
+
ΠΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ Π² ΠΎΠ±Π»Π°ΡΡΡ
|
2597
|
+
Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΊΠ»Π°ΡΡΠ°. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΎΠ½Π° Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π²Π΅Π΄Π΅Ρ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ ΠΎΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ
|
2598
|
+
ΠΊΠ»Π°ΡΡΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Ρ Π²Π°Ρ Π½Π΅Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ ΠΊΠ»Π°ΡΡΡ. Π’ΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΡΠ²Π½ΠΎ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½ΡΠ΅
|
2599
|
+
Π΄Π»Ρ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π±ΡΠ΄ΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ, Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
/ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ
|
2600
|
+
ΠΊΠ»Π°ΡΡΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ (ΠΈΠ½Π°ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, Ρ Π²Π°Ρ Π±ΡΠ΄Π΅Ρ Π΄ΡΡΠ³ΠΎΠΉ `self` ΠΎΠ±ΡΠ΅ΠΊΡ). ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅
|
2601
|
+
Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ
|
2602
|
+
`Sinatra::Delegator.delegate :method_name`.
|
2603
|
+
|
2604
|
+
Π£ Π²Π°Ρ Π±ΡΠ΄Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²Π½ΡΡΡΠΈ:
|
2605
|
+
|
2606
|
+
* ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ Π²Π΅ΡΡ
Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ΄Π΅Π»Π°Π»ΠΈ `require 'sinatra'`;
|
2607
|
+
* ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ `Sinatra::Delegator`.
|
2608
|
+
|
2609
|
+
ΠΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ°ΠΌΠΈ Π² ΠΊΠΎΠ΄: Π²ΠΎΡ
|
2610
|
+
[ΠΏΡΠΈΠΌΠ΅ΡΡ Sinatra::Delegator](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/base.rb#L1609-1633)
|
2611
|
+
[ΡΠ°ΡΡΠΈΡΡΠ΅Ρ Π³Π»Π°Π²Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/main.rb#L28-30).
|
2612
|
+
|
2613
|
+
## ΠΠΎΠΌΠ°Π½Π΄Π½Π°Ρ ΡΡΡΠΎΠΊΠ°
|
2614
|
+
|
2615
|
+
Sinatra ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π·Π°ΠΏΡΡΠ΅Π½Ρ Π½Π°ΠΏΡΡΠΌΡΡ:
|
2616
|
+
|
2617
|
+
```
|
2618
|
+
ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
2619
|
+
```
|
2620
|
+
|
2621
|
+
ΠΠΏΡΠΈΠΈ Π²ΠΊΠ»ΡΡΠ°ΡΡ:
|
2622
|
+
|
2623
|
+
```
|
2624
|
+
-h # ΡΠ°Π·Π΄Π΅Π» ΠΏΠΎΠΌΠΎΡΠΈ
|
2625
|
+
-p # ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ° (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 4567)
|
2626
|
+
-o # ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ
ΠΎΡΡΠ° (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 0.0.0.0)
|
2627
|
+
-e # ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, ΡΠ΅ΠΆΠΈΠΌΠ° (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ development)
|
2628
|
+
-s # ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ rack ΡΠ΅ΡΠ²Π΅ΡΠ°/ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ thin)
|
2629
|
+
-x # Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΌΡΡΡΠ΅ΠΊΡ-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΡΠΊΠ»ΡΡΠ΅Π½Π°)
|
2630
|
+
```
|
2631
|
+
|
2632
|
+
## Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
|
2633
|
+
|
2634
|
+
Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ Ruby ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ:
|
2635
|
+
|
2636
|
+
<dl>
|
2637
|
+
<dt>Ruby 1.8.7</dt>
|
2638
|
+
<dd>1.8.7 ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ, ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΅ΡΠ»ΠΈ Π²Π°Ρ Π½ΠΈΡΡΠΎ Π½Π΅ Π΄Π΅ΡΠΆΠΈΡ Π½Π°
|
2639
|
+
ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ, ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡΡΡ Π΄ΠΎ 1.9.2 ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° JRuby ΠΈΠ»ΠΈ
|
2640
|
+
Rubinius. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 1.8.7 Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½Π° Π΄ΠΎ Π²ΡΡ
ΠΎΠ΄Π° Sinatra 2.0 ΠΈ Ruby
|
2641
|
+
2.0, ΡΠ°Π·Π²Π΅ ΡΡΠΎ Π² ΡΠ»ΡΡΠ°Π΅ ΡΠ΅Π»ΠΈΠ·Π° 1.8.8 (ΡΡΠΎ ΠΌΠ°Π»ΠΎΠ²Π΅ΡΠΎΡΡΠ½ΠΎ). ΠΠΎ Π΄Π°ΠΆΠ΅ ΡΠΎΠ³Π΄Π°,
|
2642
|
+
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½Π°. <b>Ruby 1.8.6 Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅
|
2643
|
+
ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ.</b> ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ 1.8.6, ΠΎΡΠΊΠ°ΡΠΈΡΠ΅ΡΡ Π΄ΠΎ Sinatra
|
2644
|
+
1.2, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π²ΡΠ΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π΄ΠΎ ΡΠ΅Ρ
ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅
|
2645
|
+
Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΡΡΠ΅Π½Π° Sinatra 1.4.0.</dd>
|
2646
|
+
|
2647
|
+
<dt>Ruby 1.9.2</dt>
|
2648
|
+
<dd>1.9.2 ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΠΈ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Π° ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
|
2649
|
+
ΠΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ 1.9.2p0,
|
2650
|
+
ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΡΠΎ ΡΡΠ° Π²Π΅ΡΡΠΈΡ ΠΎΡΠ΅Π½Ρ Π½Π΅ΡΡΠ°Π±ΠΈΠ»ΡΠ½Π° ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Sinatra. ΠΡΠ°
|
2651
|
+
Π²Π΅ΡΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ Π΄ΠΎ Π²ΡΡ
ΠΎΠ΄Π° Ruby 1.9.4/2.0, Π°
|
2652
|
+
ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ 1.9 Π±ΡΠ΄Π΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΡΡ Π΄ΠΎ ΡΠ΅Ρ
ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΎΠ½Π°
|
2653
|
+
ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Ruby.</dd>
|
2654
|
+
|
2655
|
+
<dt>Ruby 1.9.3</dt>
|
2656
|
+
<dd>1.9.3 ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ. ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Π½Π° 1.9.3 Ρ
|
2657
|
+
ΡΠ°Π½Π½ΠΈΡ
Π²Π΅ΡΡΠΈΠΉ ΡΠ΄Π΅Π»Π°Π΅Ρ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ Π²ΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ.</dd>
|
2658
|
+
|
2659
|
+
<dt>Rubinius</dt>
|
2660
|
+
<dd>Rubinius ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ (Rubinius >= 1.2.4), Π²ΡΡ, Π²ΠΊΠ»ΡΡΠ°Ρ Π²ΡΠ΅
|
2661
|
+
ΡΠ·ΡΠΊΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ², ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΡΠ΅Π΄ΡΡΠΎΡΡΠΈΠΉ ΡΠ΅Π»ΠΈΠ· 2.0 ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ.</dd>
|
2662
|
+
|
2663
|
+
<dt>JRuby</dt>
|
2664
|
+
<dd>JRuby ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ (JRuby >= 1.6.5). ΠΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ
ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ
|
2665
|
+
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΡ
ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ². Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΅ΡΠ»ΠΈ Π²Ρ Π²ΡΠ±ΠΈΡΠ°Π΅ΡΠ΅
|
2666
|
+
JRuby, ΡΠΎ, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° JRuby Rack-ΡΠ΅ΡΠ²Π΅ΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Thin Π½Π΅
|
2667
|
+
ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π½Π° JRuby. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ Π½Π° C Π² JRuby Π²ΡΠ΅
|
2668
|
+
Π΅ΡΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ, ΡΡΠΎ Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π·Π°ΡΡΠ°Π³ΠΈΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ RDiscount,
|
2669
|
+
Redcarpet ΠΈ RedCloth.</dd>
|
2670
|
+
</dl>
|
2671
|
+
|
2672
|
+
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠ»Π΅Π΄ΠΈΠΌ Π·Π° ΠΏΡΠ΅Π΄ΡΡΠΎΡΡΠΈΠΌΠΈ ΠΊ Π²ΡΡ
ΠΎΠ΄Ρ Π²Π΅ΡΡΠΈΡΠΌΠΈ Ruby.
|
2673
|
+
|
2674
|
+
Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Ruby Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎ, Π½ΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΡΠΎ Π½Π°
|
2675
|
+
Π½ΠΈΡ
Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Sinatra:
|
2676
|
+
|
2677
|
+
* ΡΡΠ°ΡΡΠ΅ Π²Π΅ΡΡΠΈΠΈ JRuby ΠΈ Rubinius;
|
2678
|
+
* Ruby Enterprise Edition;
|
2679
|
+
* MacRuby, Maglev, IronRuby;
|
2680
|
+
* Ruby 1.9.0 ΠΈ 1.9.1 (Π½Π°ΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡΡΡΡ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ).
|
2681
|
+
|
2682
|
+
Π’ΠΎ, ΡΡΠΎ Π²Π΅ΡΡΠΈΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ, ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ, Π΅ΡΠ»ΠΈ ΡΡΠΎ-ΡΠΎ Π½Π΅
|
2683
|
+
ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ, Π° Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ β ΡΡΠΎ Π½Π΅ Π½Π°ΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°,
|
2684
|
+
Π° ΠΈΡ
.
|
2685
|
+
|
2686
|
+
ΠΡ ΡΠ°ΠΊΠΆΠ΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π½Π°ΡΠΈ CI-ΡΠ΅ΡΡΡ Π½Π° Π²Π΅ΡΡΠΈΠΈ Ruby, Π½Π°Ρ
ΠΎΠ΄ΡΡΠ΅ΠΉΡΡ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅
|
2687
|
+
(ΠΏΡΠ΅Π΄ΡΡΠΎΡΡΠ΅ΠΉ 2.0.0), ΠΈ Π½Π° 1.9.4, Π½ΠΎ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π½ΠΈΡΠ΅Π³ΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ
|
2688
|
+
ΠΎΠ½ΠΈ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅. ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ 1.9.4p0 ΠΈ 2.0.0p0 Π±ΡΠ΄ΡΡ
|
2689
|
+
ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ.
|
2690
|
+
|
2691
|
+
Sinatra Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° Π»ΡΠ±ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π΅ΡΡΡ ΠΎΠ΄Π½Π° ΠΈΠ·
|
2692
|
+
ΡΠΊΠ°Π·Π°Π½Π½ΡΡ
Π²ΡΡΠ΅ Π²Π΅ΡΡΠΈΠΉ Ruby.
|
2693
|
+
|
2694
|
+
ΠΠΎΠΊΠ° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ Sinatra Π½Π° Cardinal, SmallRuby, BlueRuby ΠΈ Π½Π° Π»ΡΠ±ΠΎΠΉ
|
2695
|
+
Π²Π΅ΡΡΠΈΠΈ Ruby Π΄ΠΎ 1.8.7.
|
2696
|
+
|
2697
|
+
## ΠΠ° ΠΎΡΡΡΠΈΠ΅
|
2698
|
+
|
2699
|
+
ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΠΌΡΠΉ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΊΠΎΠ΄ Sinatra, Π½Π΅ Π±ΠΎΠΉΡΠ΅ΡΡ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ
|
2700
|
+
ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΊΠΎΠ΄ΠΎΠΌ ΠΈΠ· master Π²Π΅ΡΠΊΠΈ Sinatra, ΠΎΠ½Π° Π²Π΅ΡΡΠΌΠ° ΡΡΠ°Π±ΠΈΠ»ΡΠ½Π°.
|
2701
|
+
|
2702
|
+
ΠΡ ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠ΅ΠΌΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ, ΡΠ°ΠΊ ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅
|
2703
|
+
Π΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ:
|
2704
|
+
|
2705
|
+
```
|
2706
|
+
gem install sinatra --pre
|
2707
|
+
```
|
2708
|
+
|
2709
|
+
Π§ΡΠΎΠ±Ρ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΠ°ΠΌΡΠΌΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ.
|
2710
|
+
|
2711
|
+
### Π‘ ΠΏΠΎΠΌΠΎΡΡΡ Bundler
|
2712
|
+
|
2713
|
+
ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ Sinatra, ΡΠΎ
|
2714
|
+
ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ [Bundler](http://gembundler.com/).
|
2715
|
+
|
2716
|
+
Π‘Π½Π°ΡΠ°Π»Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Bundler, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅Π³ΠΎ Π΅ΡΠ΅ Π½Π΅Ρ:
|
2717
|
+
|
2718
|
+
```
|
2719
|
+
gem install bundler
|
2720
|
+
```
|
2721
|
+
|
2722
|
+
ΠΠ°ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» `Gemfile` Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°:
|
2723
|
+
|
2724
|
+
```ruby
|
2725
|
+
source :rubygems
|
2726
|
+
gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
|
2727
|
+
|
2728
|
+
# Π΄ΡΡΠ³ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
|
2729
|
+
gem 'haml' # Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ haml
|
2730
|
+
gem 'activerecord', '~> 3.0' # ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, Π²Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΈ ActiveRecord 3.x
|
2731
|
+
```
|
2732
|
+
|
2733
|
+
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
|
2734
|
+
Π² ΡΡΠΎΠΌ ΡΠ°ΠΉΠ»Π΅. ΠΠ΄Π½Π°ΠΊΠΎ, Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Sinatra (Rack ΠΈ Tilt)
|
2735
|
+
Bundler Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΊΠ°ΡΠ°Π΅Ρ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ.
|
2736
|
+
|
2737
|
+
Π’Π΅ΠΏΠ΅ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊ:
|
2738
|
+
|
2739
|
+
```
|
2740
|
+
bundle exec ruby myapp.rb
|
2741
|
+
```
|
2742
|
+
|
2743
|
+
### ΠΡΡΡΠ½ΡΡ
|
2744
|
+
|
2745
|
+
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΊΠ»ΠΎΠ½ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΠΉΡΠ΅ ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ
|
2746
|
+
`sinatra/lib` Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠ΅ΠΉ Π² `$LOAD_PATH`:
|
2747
|
+
|
2748
|
+
```
|
2749
|
+
cd myapp
|
2750
|
+
git clone git://github.com/sinatra/sinatra.git
|
2751
|
+
ruby -Isinatra/lib myapp.rb
|
2752
|
+
```
|
2753
|
+
|
2754
|
+
Π§ΡΠΎΠ±Ρ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ Sinatra:
|
2755
|
+
|
2756
|
+
```
|
2757
|
+
cd myapp/sinatra
|
2758
|
+
git pull
|
2759
|
+
```
|
2760
|
+
|
2761
|
+
### Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎ
|
2762
|
+
|
2763
|
+
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠ±ΡΠ°ΡΡ gem:
|
2764
|
+
|
2765
|
+
```
|
2766
|
+
git clone git://github.com/sinatra/sinatra.git
|
2767
|
+
cd sinatra
|
2768
|
+
rake sinatra.gemspec
|
2769
|
+
rake install
|
2770
|
+
```
|
2771
|
+
|
2772
|
+
ΠΡΠ»ΠΈ Π²Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ (gem) ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ root, ΡΠΎ Π²Π°ΡΠΈΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ
|
2773
|
+
ΡΠ°Π³ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°
|
2774
|
+
|
2775
|
+
```
|
2776
|
+
sudo rake install
|
2777
|
+
```
|
2778
|
+
|
2779
|
+
## ΠΠ΅ΡΡΠΈΠΈ
|
2780
|
+
|
2781
|
+
Sinatra ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ [Semantic Versioning](http://semver.org/), SemVer ΠΈ
|
2782
|
+
SemVerTag.
|
2783
|
+
|
2784
|
+
## ΠΠ°Π»ΡΠ½Π΅ΠΉΡΠ΅Π΅ ΡΡΠ΅Π½ΠΈΠ΅
|
2785
|
+
|
2786
|
+
* [ΠΠ΅Π±-ΡΠ°ΠΉΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°](http://www.sinatrarb.com/) β ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ
|
2787
|
+
Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, Π½ΠΎΠ²ΠΎΡΡΠΈ ΠΈ ΡΡΡΠ»ΠΊΠΈ Π½Π° Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ΅ΡΡΡΡΡ.
|
2788
|
+
* [Π£ΡΠ°ΡΡΠΈΠ΅ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅](http://www.sinatrarb.com/contributing) β ΠΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ
|
2789
|
+
Π±Π°Π³? ΠΡΠΆΠ½Π° ΠΏΠΎΠΌΠΎΡΡ? ΠΠ°ΠΏΠΈΡΠ°Π»ΠΈ ΠΏΠ°ΡΡ?
|
2790
|
+
* [Π‘Π»Π΅ΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ/ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ](http://github.com/sinatra/sinatra/issues)
|
2791
|
+
* [Twitter](http://twitter.com/sinatra)
|
2792
|
+
* [ΠΡΡΠΏΠΏΡ ΡΠ°ΡΡΡΠ»ΠΊΠΈ](http://groups.google.com/group/sinatrarb/topics)
|
2793
|
+
* [#sinatra](irc://chat.freenode.net/#sinatra) Π½Π° http://freenode.net
|
2794
|
+
* [Sinatra Book](http://sinatra-book.gittr.com) ΡΡΠ΅Π±Π½ΠΈΠΊ ΠΈ ΡΠ±ΠΎΡΠ½ΠΈΠΊ ΡΠ΅ΡΠ΅ΠΏΡΠΎΠ²
|
2795
|
+
* [Sinatra Recipes](http://recipes.sinatrarb.com/) ΡΠ±ΠΎΡΠ½ΠΈΠΊ ΡΠ΅ΡΠ΅ΠΏΡΠΎΠ²
|
2796
|
+
* API Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΊ [ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌΡ ΡΠ΅Π»ΠΈΠ·Ρ](http://rubydoc.info/gems/sinatra)
|
2797
|
+
ΠΈΠ»ΠΈ [ΡΠ΅ΠΊΡΡΠ΅ΠΌΡ HEAD](http://rubydoc.info/github/sinatra/sinatra) Π½Π°
|
2798
|
+
http://rubydoc.info
|
2799
|
+
* [Π‘Π΅ΡΠ²Π΅Ρ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠΉ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ](http://travis-ci.org/sinatra/sinatra)
|