sinatra-acd 1.4.5
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|