sinatra 1.3.0.a → 1.3.0.b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- data/CHANGES +26 -0
- data/Gemfile +1 -0
- data/README.de.rdoc +103 -39
- data/README.es.rdoc +69 -23
- data/README.fr.rdoc +128 -49
- data/README.rdoc +67 -23
- data/README.ru.rdoc +177 -158
- data/lib/sinatra/base.rb +76 -31
- data/lib/sinatra/showexceptions.rb +1 -1
- data/sinatra.gemspec +2 -3
- data/test/delegator_test.rb +20 -1
- data/test/helpers_test.rb +23 -1
- data/test/routing_test.rb +90 -3
- data/test/templates_test.rb +1 -1
- metadata +3 -4
- data/test/hello.mab +0 -1
data/README.rdoc
CHANGED
@@ -1099,29 +1099,33 @@ error handlers) through the <tt>request</tt> method:
|
|
1099
1099
|
|
1100
1100
|
# app running on http://example.com/example
|
1101
1101
|
get '/foo' do
|
1102
|
-
|
1103
|
-
request.
|
1104
|
-
request.
|
1105
|
-
request.
|
1106
|
-
request.
|
1107
|
-
request.
|
1108
|
-
request.
|
1109
|
-
request.
|
1110
|
-
request.
|
1111
|
-
request.
|
1112
|
-
request.
|
1113
|
-
request.
|
1114
|
-
request
|
1115
|
-
request.
|
1116
|
-
request.
|
1117
|
-
request.
|
1118
|
-
request
|
1119
|
-
request.
|
1120
|
-
request.
|
1121
|
-
request.
|
1122
|
-
request.
|
1123
|
-
request.
|
1124
|
-
request.
|
1102
|
+
t = %w[text/css text/html application/javascript]
|
1103
|
+
request.accept # ['text/html', '*/*']
|
1104
|
+
request.accept? 'text/xml' # true
|
1105
|
+
request.preferred_type(t) # 'text/html'
|
1106
|
+
request.body # request body sent by the client (see below)
|
1107
|
+
request.scheme # "http"
|
1108
|
+
request.script_name # "/example"
|
1109
|
+
request.path_info # "/foo"
|
1110
|
+
request.port # 80
|
1111
|
+
request.request_method # "GET"
|
1112
|
+
request.query_string # ""
|
1113
|
+
request.content_length # length of request.body
|
1114
|
+
request.media_type # media type of request.body
|
1115
|
+
request.host # "example.com"
|
1116
|
+
request.get? # true (similar methods for other verbs)
|
1117
|
+
request.form_data? # false
|
1118
|
+
request["SOME_HEADER"] # value of SOME_HEADER header
|
1119
|
+
request.referrer # the referrer of the client or '/'
|
1120
|
+
request.user_agent # user agent (used by :agent condition)
|
1121
|
+
request.cookies # hash of browser cookies
|
1122
|
+
request.xhr? # is this an ajax request?
|
1123
|
+
request.url # "http://example.com/example/foo"
|
1124
|
+
request.path # "/example/foo"
|
1125
|
+
request.ip # client IP address
|
1126
|
+
request.secure? # false (would be true over ssl)
|
1127
|
+
request.forwarded? # true (if running behind a reverse proxy)
|
1128
|
+
request.env # raw env hash handed in by Rack
|
1125
1129
|
end
|
1126
1130
|
|
1127
1131
|
Some options, like <tt>script_name</tt> or <tt>path_info</tt>, can also be
|
@@ -1615,6 +1619,45 @@ application (Rails/Ramaze/Camping/...):
|
|
1615
1619
|
get('/') { "Hello #{session['user_name']}." }
|
1616
1620
|
end
|
1617
1621
|
|
1622
|
+
=== Dynamic Application Creation
|
1623
|
+
|
1624
|
+
Sometimes you want to create new applications at runtime without having to
|
1625
|
+
assign them to a constant, you can do this with `Sinatra.new`:
|
1626
|
+
|
1627
|
+
require 'sinatra/base'
|
1628
|
+
my_app = Sinatra.new { get('/') { "hi" } }
|
1629
|
+
my_app.run!
|
1630
|
+
|
1631
|
+
It takes the application to inherit from as optional argument:
|
1632
|
+
|
1633
|
+
require 'sinatra/base'
|
1634
|
+
|
1635
|
+
controller = Sinatra.new do
|
1636
|
+
enable :logging
|
1637
|
+
helpers MyHelpers
|
1638
|
+
end
|
1639
|
+
|
1640
|
+
map('/a') do
|
1641
|
+
run Sinatra.new(controller) { get('/') { 'a' } }
|
1642
|
+
end
|
1643
|
+
|
1644
|
+
map('/b') do
|
1645
|
+
run Sinatra.new(controller) { get('/') { 'b' } }
|
1646
|
+
end
|
1647
|
+
|
1648
|
+
This is especially useful for testing Sinatra extensions or using Sinatra in
|
1649
|
+
your own library.
|
1650
|
+
|
1651
|
+
This also makes using Sinatra as middleware extremely easy:
|
1652
|
+
|
1653
|
+
require 'sinatra/base'
|
1654
|
+
|
1655
|
+
use Sinatra do
|
1656
|
+
get('/') { ... }
|
1657
|
+
end
|
1658
|
+
|
1659
|
+
run RailsProject::Application
|
1660
|
+
|
1618
1661
|
== Scopes and Binding
|
1619
1662
|
|
1620
1663
|
The scope you are currently in determines what methods and variables are
|
@@ -1647,6 +1690,7 @@ You have the application scope binding inside:
|
|
1647
1690
|
* Methods defined by extensions
|
1648
1691
|
* The block passed to +helpers+
|
1649
1692
|
* Procs/blocks used as value for +set+
|
1693
|
+
* The block passed to <tt>Sinatra.new</tt>
|
1650
1694
|
|
1651
1695
|
You can reach the scope object (the class) like this:
|
1652
1696
|
|
data/README.ru.rdoc
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
= Sinatra
|
2
2
|
<i>Внимание: Этот документ является переводом Английской версии и может быть устаревшим</i>
|
3
3
|
|
4
|
-
Sinatra — это предметно-ориентированный
|
5
|
-
приложением минимума усилий:
|
4
|
+
Sinatra — это предметно-ориентированный каркас (DSL) для быстрого создания функциональных веб-приложений на Ruby:
|
6
5
|
|
7
6
|
# myapp.rb
|
8
7
|
require 'sinatra'
|
@@ -11,20 +10,23 @@ Sinatra — это предметно-ориентированный язык (D
|
|
11
10
|
'Hello world!'
|
12
11
|
end
|
13
12
|
|
14
|
-
Установите gem
|
13
|
+
Установите gem:
|
15
14
|
|
16
15
|
gem install sinatra
|
16
|
+
|
17
|
+
и запустите приложение с помощью:
|
18
|
+
|
17
19
|
ruby -rubygems myapp.rb
|
18
20
|
|
19
|
-
Результат
|
21
|
+
Результат можно увидеть: http://localhost:4567
|
20
22
|
|
21
|
-
Рекомендуется также
|
22
|
-
|
23
|
+
Рекомендуется также установить thin, сделать это можно командой: <tt>gem install thin</tt>.
|
24
|
+
Thin - это более производительный и функциональный сервер для разработки приложений на Sinatra.
|
23
25
|
|
24
26
|
== Маршруты
|
25
27
|
|
26
|
-
В Sinatra маршрут — это пара: HTTP
|
27
|
-
Каждый маршрут ассоциирован с
|
28
|
+
В Sinatra маршрут — это пара: <HTTP метод> и <шаблон URL>.
|
29
|
+
Каждый маршрут ассоциирован с блоком кода, исполняемого внутри, пример:
|
28
30
|
|
29
31
|
get '/' do
|
30
32
|
.. что-то показать ..
|
@@ -50,7 +52,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
50
52
|
.. что-то ответить ..
|
51
53
|
end
|
52
54
|
|
53
|
-
Маршруты сверяются с запросом
|
55
|
+
Маршруты сверяются с запросом в порядке очередности их записи в файле приложения. По умолчанию, будет вызван первый совпавший с запросом маршрут.
|
54
56
|
|
55
57
|
Шаблоны маршрутов могут включать в себя параметры доступные в
|
56
58
|
<tt>params</tt> xэше:
|
@@ -67,8 +69,8 @@ Sinatra — это предметно-ориентированный язык (D
|
|
67
69
|
"Hello #{n}!"
|
68
70
|
end
|
69
71
|
|
70
|
-
Шаблоны маршрутов также могут включать splat (
|
71
|
-
в <tt>params[:splat]</tt
|
72
|
+
Шаблоны маршрутов также могут включать splat (или '*' маску, обозначающую любой символ) параметры доступные
|
73
|
+
в массиве <tt>params[:splat]</tt>:
|
72
74
|
|
73
75
|
get '/say/*/to/*' do
|
74
76
|
# соответствует /say/hello/to/world
|
@@ -80,7 +82,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
80
82
|
params[:splat] # => ["path/to/file", "xml"]
|
81
83
|
end
|
82
84
|
|
83
|
-
Маршруты также могут
|
85
|
+
Маршруты также могут содержать регулярные выражения:
|
84
86
|
|
85
87
|
get %r{/hello/([\w]+)} do
|
86
88
|
"Hello, #{params[:captures].first}!"
|
@@ -118,7 +120,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
118
120
|
builder :feed
|
119
121
|
end
|
120
122
|
|
121
|
-
|
123
|
+
Вы можете задать собственные условия:
|
122
124
|
|
123
125
|
set(:probability) { |value| condition { rand <= value } }
|
124
126
|
|
@@ -133,18 +135,17 @@ Sinatra — это предметно-ориентированный язык (D
|
|
133
135
|
=== Возвращаемые значения
|
134
136
|
|
135
137
|
Возвращаемое значение блока маршрута ограничивается телом ответа, которое будет передано HTTP клиенту,
|
136
|
-
или следующей "прослойкой" (middleware
|
138
|
+
или следующей "прослойкой" (middleware) в Rack стеке. Чаще всего это строка, как в примерах выше.
|
137
139
|
Но и другие значения также приемлемы.
|
138
140
|
|
139
|
-
Вы можете вернуть любой объект, который будет либо корректным Rack ответом, Rack
|
140
|
-
телом ответа, либо кодом состояния HTTP:
|
141
|
+
Вы можете вернуть любой объект, который будет либо корректным Rack ответом, объектом Rack body, либо кодом состояния HTTP:
|
141
142
|
|
142
|
-
*
|
143
|
-
*
|
144
|
-
*
|
145
|
-
* Fixnum,
|
143
|
+
* массив с тремя переменными: <tt>[status (Fixnum), headers (Hash), response body (должен отвечать на #each)]</tt>;
|
144
|
+
* массив с двумя переменными: <tt>[status (Fixnum), response body (должен отвечать на #each)]</tt>;
|
145
|
+
* объект, отвечающий на <tt>#each</tt>, который передает только строковые типы данных в этот блок;
|
146
|
+
* Fixnum, представляющий код состояния HTTP.
|
146
147
|
|
147
|
-
Таким
|
148
|
+
Таким образом, мы легко можем создать поточный пример:
|
148
149
|
|
149
150
|
class Stream
|
150
151
|
def each
|
@@ -157,7 +158,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
157
158
|
=== Собственные детекторы совпадений для маршрутов
|
158
159
|
|
159
160
|
Как показано выше, Sinatra поставляется со встроенной поддержкой строк и
|
160
|
-
регулярных выражений
|
161
|
+
регулярных выражений в качестве шаблонов URL. Но и это еще не все. Вы можете
|
161
162
|
легко определить свои собственные детекторы совпадений (matchers) для маршрутов:
|
162
163
|
|
163
164
|
class AllButPattern
|
@@ -181,8 +182,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
181
182
|
# ...
|
182
183
|
end
|
183
184
|
|
184
|
-
Заметьте, что предыдущий пример
|
185
|
-
быть записан в следующем виде:
|
185
|
+
Заметьте, что предыдущий пример возможно чересчур сложен, он также может быть представлен как:
|
186
186
|
|
187
187
|
get // do
|
188
188
|
pass if request.path_info == "/index"
|
@@ -198,7 +198,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
198
198
|
== Статические файлы
|
199
199
|
|
200
200
|
Статические файлы отдаются из <tt>./public</tt> директории. Вы можете указать другое место,
|
201
|
-
|
201
|
+
указав его через опцию <tt>:public</tt>:
|
202
202
|
|
203
203
|
set :public, File.dirname(__FILE__) + '/static'
|
204
204
|
|
@@ -206,17 +206,17 @@ Sinatra — это предметно-ориентированный язык (D
|
|
206
206
|
<tt>./public/css/style.css</tt> будет доступен как
|
207
207
|
<tt>http://example.com/css/style.css</tt>.
|
208
208
|
|
209
|
-
==
|
209
|
+
== Представления / Шаблоны
|
210
210
|
|
211
|
-
Шаблоны по умолчанию
|
212
|
-
Для использования другой
|
211
|
+
Шаблоны по умолчанию должны находиться в директории <tt>./views</tt>.
|
212
|
+
Для использования другой директории шаблонов:
|
213
213
|
|
214
214
|
set :views, File.dirname(__FILE__) + '/templates'
|
215
215
|
|
216
216
|
Важно помнить, что вы всегда должны указывать шаблоны
|
217
217
|
с помощью символов, даже если это подкаталог (в этом случае
|
218
218
|
используйте <tt>:'subdir/template'</tt>). Вы должны использовать
|
219
|
-
символ, иначе
|
219
|
+
символ, иначе методы рендеринга, отобразят просто переданную им строку.
|
220
220
|
|
221
221
|
=== Haml шаблоны
|
222
222
|
|
@@ -229,7 +229,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
229
229
|
haml :index
|
230
230
|
end
|
231
231
|
|
232
|
-
|
232
|
+
Отобразит <tt>./views/index.haml</tt>.
|
233
233
|
|
234
234
|
{Опции Haml}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
|
235
235
|
могут быть установлены глобально через конфигурацию Sinatra,
|
@@ -252,7 +252,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
252
252
|
erb :index
|
253
253
|
end
|
254
254
|
|
255
|
-
|
255
|
+
Отобразит <tt>./views/index.erb</tt>.
|
256
256
|
|
257
257
|
=== Erubis шаблоны
|
258
258
|
|
@@ -265,7 +265,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
265
265
|
erubis :index
|
266
266
|
end
|
267
267
|
|
268
|
-
|
268
|
+
Отобразит <tt>./views/index.erubis</tt>.
|
269
269
|
|
270
270
|
Также возможно заменить Erb на Erubis:
|
271
271
|
|
@@ -276,7 +276,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
276
276
|
erb :index
|
277
277
|
end
|
278
278
|
|
279
|
-
|
279
|
+
Отобразит <tt>./views/index.erb</tt> с помощью Erubis.
|
280
280
|
|
281
281
|
=== Builder шаблоны
|
282
282
|
|
@@ -289,7 +289,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
289
289
|
builder :index
|
290
290
|
end
|
291
291
|
|
292
|
-
|
292
|
+
Отобразит <tt>./views/index.builder</tt>.
|
293
293
|
|
294
294
|
=== Nokogiri шаблоны
|
295
295
|
|
@@ -302,7 +302,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
302
302
|
nokogiri :index
|
303
303
|
end
|
304
304
|
|
305
|
-
|
305
|
+
Отобразит <tt>./views/index.nokogiri</tt>.
|
306
306
|
|
307
307
|
=== Sass шаблоны
|
308
308
|
|
@@ -315,7 +315,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
315
315
|
sass :stylesheet
|
316
316
|
end
|
317
317
|
|
318
|
-
|
318
|
+
Отобразит <tt>./views/stylesheet.sass</tt>.
|
319
319
|
|
320
320
|
{Опции Sass}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
|
321
321
|
могут быть установлены глобально через конфигурацию Sinatra,
|
@@ -339,7 +339,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
339
339
|
scss :stylesheet
|
340
340
|
end
|
341
341
|
|
342
|
-
|
342
|
+
Отобразит <tt>./views/stylesheet.scss</tt>.
|
343
343
|
|
344
344
|
{Опции Scss}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
|
345
345
|
могут быть установлены глобально через конфигурацию Sinatra,
|
@@ -363,7 +363,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
363
363
|
less :stylesheet
|
364
364
|
end
|
365
365
|
|
366
|
-
|
366
|
+
Отобразит <tt>./views/stylesheet.less</tt>.
|
367
367
|
|
368
368
|
=== Liquid шаблоны
|
369
369
|
|
@@ -376,7 +376,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
376
376
|
liquid :index
|
377
377
|
end
|
378
378
|
|
379
|
-
|
379
|
+
Отобразит <tt>./views/index.liquid</tt>.
|
380
380
|
|
381
381
|
Так как в Liquid шаблонах невозможно вызывать методы из Ruby (кроме +yield+),
|
382
382
|
то вы почти всегда будете передавать локальные переменные:
|
@@ -388,13 +388,13 @@ Sinatra — это предметно-ориентированный язык (D
|
|
388
388
|
<tt>rdiscount</tt> gem/библиотека необходима для рендеринга Markdown шаблонов:
|
389
389
|
|
390
390
|
# Вам нужно будет подключить rdiscount в приложении
|
391
|
-
require
|
391
|
+
require 'rdiscount'
|
392
392
|
|
393
393
|
get '/' do
|
394
394
|
markdown :index
|
395
395
|
end
|
396
396
|
|
397
|
-
|
397
|
+
Отобразит <tt>./views/index.markdown</tt> (+md+ и +mkd+ также являются допустимыми файловыми
|
398
398
|
расширениями).
|
399
399
|
|
400
400
|
В Markdown невозможно вызывать методы или передавать локальные переменные.
|
@@ -410,14 +410,14 @@ Sinatra — это предметно-ориентированный язык (D
|
|
410
410
|
|
411
411
|
Вы не можете вызывать Ruby из Markdown, соответственно, вы не можете использовать
|
412
412
|
лэйаут-шаблоны (layouts) на Markdown. Тем не менее, есть возможность использовать один
|
413
|
-
движок рендеринга для шаблона, а другой для лэйаута с помощью опции <tt>:layout_engine</tt>:
|
413
|
+
движок рендеринга для шаблона, а другой для лэйаута (разметки) с помощью опции <tt>:layout_engine</tt>:
|
414
414
|
|
415
415
|
get '/' do
|
416
416
|
markdown :index, :layout_engine => :erb
|
417
417
|
end
|
418
418
|
|
419
|
-
|
420
|
-
|
419
|
+
Отобразит <tt>./views/index.md</tt> с <tt>./views/layout.erb</tt> в качестве
|
420
|
+
лэйаута (разметки).
|
421
421
|
|
422
422
|
Также вы можете задать такие опции рендеринга глобально:
|
423
423
|
|
@@ -427,8 +427,8 @@ Sinatra — это предметно-ориентированный язык (D
|
|
427
427
|
markdown :index
|
428
428
|
end
|
429
429
|
|
430
|
-
|
431
|
-
<tt>./views/post.haml</tt> в качестве
|
430
|
+
Отобразит <tt>./views/index.md</tt> (и любой другой шаблон на Markdown) с
|
431
|
+
<tt>./views/post.haml</tt> в качестве лэйаута (разметки).
|
432
432
|
|
433
433
|
Также возможно обрабатывать Markdown с помощью BlueCloth, а не RDiscount:
|
434
434
|
|
@@ -442,20 +442,20 @@ Sinatra — это предметно-ориентированный язык (D
|
|
442
442
|
markdown :index
|
443
443
|
end
|
444
444
|
|
445
|
-
|
445
|
+
Отобразит <tt>./views/index.md</tt> с помощью BlueCloth.
|
446
446
|
|
447
447
|
=== Textile шаблоны
|
448
448
|
|
449
449
|
<tt>RedCloth</tt> gem/библиотека необходима для рендеринга Textile шаблонов:
|
450
450
|
|
451
451
|
# Вам нужно будет подключить redcloth в приложении
|
452
|
-
require
|
452
|
+
require 'redcloth'
|
453
453
|
|
454
454
|
get '/' do
|
455
455
|
textile :index
|
456
456
|
end
|
457
457
|
|
458
|
-
|
458
|
+
Отобразит <tt>./views/index.textile</tt>.
|
459
459
|
|
460
460
|
В Textile невозможно вызывать методы или передавать локальные переменные. Следовательно, вам, скорее всего,
|
461
461
|
придется использовать этот шаблон совместно с другим движком рендеринга:
|
@@ -469,14 +469,14 @@ Sinatra — это предметно-ориентированный язык (D
|
|
469
469
|
|
470
470
|
Вы не можете вызывать Ruby из Textile, соответственно, вы не можете использовать
|
471
471
|
лэйаут-шаблоны на Textile. Тем не менее, есть возможность использовать один
|
472
|
-
движок рендеринга для шаблона, а другой для лэйаута с помощью опции <tt>:layout_engine</tt>:
|
472
|
+
движок рендеринга для шаблона, а другой для лэйаута (разметки) с помощью опции <tt>:layout_engine</tt>:
|
473
473
|
|
474
474
|
get '/' do
|
475
475
|
textile :index, :layout_engine => :erb
|
476
476
|
end
|
477
477
|
|
478
|
-
|
479
|
-
|
478
|
+
Отобразит <tt>./views/index.textile</tt> с <tt>./views/layout.erb</tt> в качестве
|
479
|
+
лэйаута (разметки).
|
480
480
|
|
481
481
|
Также вы можете задать такие опции рендеринга глобально:
|
482
482
|
|
@@ -486,21 +486,21 @@ Sinatra — это предметно-ориентированный язык (D
|
|
486
486
|
textile :index
|
487
487
|
end
|
488
488
|
|
489
|
-
|
490
|
-
<tt>./views/post.haml</tt> в качестве
|
489
|
+
Отобразит <tt>./views/index.textile</tt> (и любой другой шаблон на Textile) с
|
490
|
+
<tt>./views/post.haml</tt> в качестве лэйаута (разметки).
|
491
491
|
|
492
492
|
=== RDoc шаблоны
|
493
493
|
|
494
494
|
<tt>rdoc</tt> gem/библиотека необходима для рендеринга RDoc шаблонов:
|
495
495
|
|
496
496
|
# Вам нужно будет подключить rdoc/markup/to_html в приложении
|
497
|
-
require
|
497
|
+
require 'rdoc/markup/to_html'
|
498
498
|
|
499
499
|
get '/' do
|
500
500
|
rdoc :index
|
501
501
|
end
|
502
502
|
|
503
|
-
|
503
|
+
Отобразит <tt>./views/index.rdoc</tt>.
|
504
504
|
|
505
505
|
В RDoc невозможно вызывать методы или передавать локальные переменные. Следовательно, вам, скорее всего,
|
506
506
|
придется использовать этот шаблон совместно с другим движком рендеринга:
|
@@ -514,14 +514,14 @@ Sinatra — это предметно-ориентированный язык (D
|
|
514
514
|
|
515
515
|
Вы не можете вызывать Ruby из RDoc, соответственно, вы не можете использовать
|
516
516
|
лэйаут-шаблоны на RDoc. Тем не менее, есть возможность использовать один
|
517
|
-
движок рендеринга для шаблона, а другой для лэйаута с помощью опции <tt>:layout_engine</tt>:
|
517
|
+
движок рендеринга для шаблона, а другой для лэйаута (разметки) с помощью опции <tt>:layout_engine</tt>:
|
518
518
|
|
519
519
|
get '/' do
|
520
520
|
rdoc :index, :layout_engine => :erb
|
521
521
|
end
|
522
522
|
|
523
|
-
|
524
|
-
|
523
|
+
Отобразит <tt>./views/index.rdoc</tt> с <tt>./views/layout.erb</tt> в качестве
|
524
|
+
лэйаута (разметки).
|
525
525
|
|
526
526
|
Также вы можете задать такие опции рендеринга глобально:
|
527
527
|
|
@@ -531,8 +531,8 @@ Sinatra — это предметно-ориентированный язык (D
|
|
531
531
|
rdoc :index
|
532
532
|
end
|
533
533
|
|
534
|
-
|
535
|
-
<tt>./views/post.haml</tt> в качестве
|
534
|
+
Отобразит <tt>./views/index.rdoc</tt> (и любой другой шаблон на RDoc) с
|
535
|
+
<tt>./views/post.haml</tt> в качестве лэйаута (разметки).
|
536
536
|
|
537
537
|
=== Radius шаблоны
|
538
538
|
|
@@ -545,7 +545,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
545
545
|
radius :index
|
546
546
|
end
|
547
547
|
|
548
|
-
|
548
|
+
Отобразит <tt>./views/index.radius</tt>.
|
549
549
|
|
550
550
|
Так как в Radius шаблоне невозможно вызывать методы из Ruby (кроме +yield+),
|
551
551
|
то вы почти всегда будете передавать локальные переменные:
|
@@ -563,7 +563,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
563
563
|
markaby :index
|
564
564
|
end
|
565
565
|
|
566
|
-
|
566
|
+
Отобразит <tt>./views/index.mab</tt>.
|
567
567
|
|
568
568
|
Вы также можете использовать внутристроковые Markaby шаблоны:
|
569
569
|
|
@@ -582,29 +582,29 @@ Sinatra — это предметно-ориентированный язык (D
|
|
582
582
|
slim :index
|
583
583
|
end
|
584
584
|
|
585
|
-
|
585
|
+
Отобразит <tt>./views/index.slim</tt>.
|
586
586
|
|
587
587
|
=== CoffeeScript шаблоны
|
588
588
|
|
589
589
|
Вам понадобится <tt>coffee-script</tt> gem/библиотека и что-то <b>одно</b> из следующего списка,
|
590
590
|
чтобы запускать JavaScript:
|
591
591
|
|
592
|
-
* +node+ (из Node.js)
|
593
|
-
* вы можете использовать
|
594
|
-
* +therubyracer+ gem
|
592
|
+
* +node+ (из Node.js);
|
593
|
+
* вы можете использовать OS X (в которой есть встроенные средства для выполнения JavaScript);
|
594
|
+
* +therubyracer+ gem/библиотека.
|
595
595
|
|
596
596
|
Подробнее смотрите на {странице проекта}[http://github.com/josh/ruby-coffee-script].
|
597
597
|
|
598
|
-
Таким
|
598
|
+
Таким образом, вы можете использовать CoffeeScript шаблоны.
|
599
599
|
|
600
|
-
# Вам нужно будет подключить coffee-script в приложении
|
600
|
+
# Вам нужно будет подключить coffee-script gem в приложении
|
601
601
|
require 'coffee-script'
|
602
602
|
|
603
603
|
get '/application.js' do
|
604
604
|
coffee :application
|
605
605
|
end
|
606
606
|
|
607
|
-
|
607
|
+
Отобразит <tt>./views/application.coffee</tt>.
|
608
608
|
|
609
609
|
=== Встроенные шаблоны
|
610
610
|
|
@@ -612,7 +612,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
612
612
|
haml '%div.title Hello World'
|
613
613
|
end
|
614
614
|
|
615
|
-
|
615
|
+
Отобразит строку встроенного шаблона.
|
616
616
|
|
617
617
|
=== Доступ к переменным в шаблонах
|
618
618
|
|
@@ -631,11 +631,11 @@ Sinatra — это предметно-ориентированный язык (D
|
|
631
631
|
haml '%h1= foo.name', :locals => { :foo => foo }
|
632
632
|
end
|
633
633
|
|
634
|
-
Это обычный подход, когда шаблоны рендерятся как
|
634
|
+
Это обычный подход, когда шаблоны рендерятся как части других шаблонов.
|
635
635
|
|
636
636
|
=== Вложенные шаблоны
|
637
637
|
|
638
|
-
Шаблоны также могут быть определены в конце
|
638
|
+
Шаблоны также могут быть определены в конце исходного файла:
|
639
639
|
|
640
640
|
require 'sinatra'
|
641
641
|
|
@@ -652,13 +652,13 @@ Sinatra — это предметно-ориентированный язык (D
|
|
652
652
|
@@ index
|
653
653
|
%div.title Hello world!!!!!
|
654
654
|
|
655
|
-
Заметьте: вложенные шаблоны, определенные в
|
655
|
+
Заметьте: вложенные шаблоны, определенные в исходном файле, который подключила Sinatra, будут
|
656
656
|
автоматически загружены. Вызовите <tt>enable :inline_templates</tt> напрямую, если у вас вложенные
|
657
657
|
шаблоны в других файлах.
|
658
658
|
|
659
659
|
=== Именные шаблоны
|
660
660
|
|
661
|
-
Шаблоны также могут быть
|
661
|
+
Шаблоны также могут быть определены при помощи <tt>template</tt> метода:
|
662
662
|
|
663
663
|
template :layout do
|
664
664
|
"%html\n =yield\n"
|
@@ -672,8 +672,8 @@ Sinatra — это предметно-ориентированный язык (D
|
|
672
672
|
haml :index
|
673
673
|
end
|
674
674
|
|
675
|
-
Если шаблон с именем "layout" существует, то он будет
|
676
|
-
|
675
|
+
Если шаблон с именем "layout" существует, то он будет использоваться каждый раз
|
676
|
+
при рендеринге. Вы можете отключать лэйаут (разметку) в каждом конкретном случае с помощью
|
677
677
|
<tt>:layout => false</tt> или отключить его для всего приложения, например, так: <tt>set :haml, :layout => false</tt>:
|
678
678
|
|
679
679
|
get '/' do
|
@@ -682,7 +682,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
682
682
|
|
683
683
|
=== Привязка файловых расширений
|
684
684
|
|
685
|
-
Чтобы связать расширение файла
|
685
|
+
Чтобы связать расширение файла с движком рендеринга, используйте
|
686
686
|
<tt>Tilt.register</tt>. Например, если вы хотите использовать расширение +tt+
|
687
687
|
для шаблонов Textile:
|
688
688
|
|
@@ -702,7 +702,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
702
702
|
myat :index
|
703
703
|
end
|
704
704
|
|
705
|
-
|
705
|
+
Отобразит <tt>./views/index.myat</tt>. Чтобы узнать больше о Tilt,
|
706
706
|
смотрите https://github.com/rtomayko/tilt
|
707
707
|
|
708
708
|
== Фильтры
|
@@ -729,9 +729,9 @@ Sinatra — это предметно-ориентированный язык (D
|
|
729
729
|
end
|
730
730
|
|
731
731
|
Заметьте: если вы используете метод +body+, а не просто возвращаете строку из
|
732
|
-
маршрута, то тело ответа не будет доступно в +after+-фильтрах,
|
732
|
+
маршрута, то тело ответа не будет доступно в +after+-фильтрах, так как оно будет сгенерировано позднее.
|
733
733
|
|
734
|
-
Фильтры могут использовать шаблоны URL и будут
|
734
|
+
Фильтры могут использовать шаблоны URL и будут интерпретированы только если путь запроса совпадет с этим шаблоном:
|
735
735
|
|
736
736
|
before '/protected/*' do
|
737
737
|
authenticate!
|
@@ -782,7 +782,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
782
782
|
end
|
783
783
|
|
784
784
|
Заметьте, что при использовании <tt>enable :sessions</tt> все данные
|
785
|
-
сохраняются в
|
785
|
+
сохраняются в cookies. Это может быть не совсем то, что вы хотите (например,
|
786
786
|
сохранение больших объемов данных увеличит ваш трафик). В таком случае вы
|
787
787
|
можете использовать альтернативную Rack "прослойку" (middleware), реализующую
|
788
788
|
механизм сессий. Для этого *не надо* вызывать <tt>enable :sessions</tt>,
|
@@ -806,8 +806,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
806
806
|
|
807
807
|
set :session_secret, 'super secret'
|
808
808
|
|
809
|
-
Если вы хотите больше настроек для сессий, вы можете задать их,
|
810
|
-
хэш с опциями и параметр +sessions+:
|
809
|
+
Если вы хотите больше настроек для сессий, вы можете задать их, передав хэш опций в параметр +sessions+:
|
811
810
|
|
812
811
|
set :sessions, :domain => 'foo.com'
|
813
812
|
|
@@ -909,6 +908,29 @@ Sinatra — это предметно-ориентированный язык (D
|
|
909
908
|
Как и +body+, методы +headers+ и +status+, вызванные без аргументов, возвращают
|
910
909
|
свои текущие значения.
|
911
910
|
|
911
|
+
=== Логирование
|
912
|
+
|
913
|
+
В области видимости запроса метод +logger+ предоставляет доступ к экземпляру +Logger+:
|
914
|
+
|
915
|
+
get '/' do
|
916
|
+
logger.info "loading data"
|
917
|
+
# ...
|
918
|
+
end
|
919
|
+
|
920
|
+
Этот логер автоматически учитывает ваши настройки логирования в Rack. Если
|
921
|
+
логирование выключено, то этот метод вернет пустой (dummy) объект, поэтому вы можете
|
922
|
+
смело использовать его в маршрутах и фильтрах.
|
923
|
+
|
924
|
+
Заметьте, что логирование включено по умолчанию только для <tt>Sinatra::Application</tt>,
|
925
|
+
а если ваше приложение -- подкласс <tt>Sinatra::Base</tt>, то вы, наверное, захотите включить
|
926
|
+
его вручную:
|
927
|
+
|
928
|
+
class MyApp < Sinatra::Base
|
929
|
+
configure(:production, :development) do
|
930
|
+
enable :logging
|
931
|
+
end
|
932
|
+
end
|
933
|
+
|
912
934
|
=== Mime-типы
|
913
935
|
|
914
936
|
Когда вы используете <tt>send_file</tt> или статические файлы, у вас могут быть mime-типы, которые Sinatra
|
@@ -916,7 +938,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
916
938
|
|
917
939
|
mime_type :foo, 'text/foo'
|
918
940
|
|
919
|
-
Вы также можете использовать это в +content_type+
|
941
|
+
Вы также можете использовать это в +content_type+ методе-помощнике:
|
920
942
|
|
921
943
|
get '/' do
|
922
944
|
content_type :foo
|
@@ -1000,9 +1022,9 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1000
1022
|
end
|
1001
1023
|
|
1002
1024
|
Чтобы как следует использовать кэши, вам следует подумать об использовании
|
1003
|
-
+etag+ и +last_modified+. Рекомендуется использовать эти
|
1025
|
+
+etag+ и +last_modified+. Рекомендуется использовать эти методы-помощники *до*
|
1004
1026
|
выполнения "тяжелых" вычислений, так как они немедленно отправят ответ клиенту,
|
1005
|
-
если текущая версия уже есть в
|
1027
|
+
если текущая версия уже есть в их кэше:
|
1006
1028
|
|
1007
1029
|
get '/article/:id' do
|
1008
1030
|
@article = Article.find params[:id]
|
@@ -1011,7 +1033,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1011
1033
|
erb :article
|
1012
1034
|
end
|
1013
1035
|
|
1014
|
-
|
1036
|
+
Также вы можете использовать
|
1015
1037
|
{weak ETag}[http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation]:
|
1016
1038
|
|
1017
1039
|
etag @article.sha1, :weak
|
@@ -1020,8 +1042,8 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1020
1042
|
необходимую информацию для вашего кэша. Если вы ищите легкое решение для
|
1021
1043
|
кэширования, попробуйте {rack-cache}[http://rtomayko.github.com/rack-cache/]:
|
1022
1044
|
|
1023
|
-
require
|
1024
|
-
require
|
1045
|
+
require 'rack/cache'
|
1046
|
+
require 'sinatra'
|
1025
1047
|
|
1026
1048
|
use Rack::Cache
|
1027
1049
|
|
@@ -1052,7 +1074,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1052
1074
|
значение для заголовка Last-Modified, по умолчанию: mtime (время изменения) файла.
|
1053
1075
|
|
1054
1076
|
[type]
|
1055
|
-
тип файла, по умолчанию:
|
1077
|
+
тип файла, по умолчанию: предполагается по расширению файла.
|
1056
1078
|
|
1057
1079
|
[disposition]
|
1058
1080
|
используется для заголовка Content-Disposition, возможные значения:
|
@@ -1067,7 +1089,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1067
1089
|
Метод <tt>send_file</tt> также обеспечивает автоматическую обработку частичных (range)
|
1068
1090
|
запросов с помощью Sinatra.
|
1069
1091
|
|
1070
|
-
===
|
1092
|
+
=== Доступ к объекту запроса
|
1071
1093
|
|
1072
1094
|
Объект входящего запроса доступен на уровне обработки запроса (в фильтрах, маршрутах,
|
1073
1095
|
обработчиках ошибок) с помощью <tt>request</tt> метода:
|
@@ -1089,7 +1111,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1089
1111
|
request["SOME_HEADER"] # значение заголовка SOME_HEADER
|
1090
1112
|
request.referrer # источник запроса клиента либо '/'
|
1091
1113
|
request.user_agent # user agent (используется для :agent условия)
|
1092
|
-
request.cookies #
|
1114
|
+
request.cookies # хеш, содержащий cookies браузера
|
1093
1115
|
request.xhr? # является ли запрос ajax запросом?
|
1094
1116
|
request.url # "http://example.com/example/foo"
|
1095
1117
|
request.path # "/example/foo"
|
@@ -1099,7 +1121,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1099
1121
|
request.env # "сырой" env хеш, полученный Rack
|
1100
1122
|
end
|
1101
1123
|
|
1102
|
-
Некоторые опции, такие как <tt>script_name</tt> или <tt>path_info</tt> доступны для
|
1124
|
+
Некоторые опции, такие как <tt>script_name</tt> или <tt>path_info</tt> доступны для изменения:
|
1103
1125
|
|
1104
1126
|
before { request.path_info = "/" }
|
1105
1127
|
|
@@ -1125,7 +1147,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1125
1147
|
"store it!"
|
1126
1148
|
end
|
1127
1149
|
|
1128
|
-
Вы также можете указать
|
1150
|
+
Вы также можете указать имя файла:
|
1129
1151
|
|
1130
1152
|
get '/' do
|
1131
1153
|
attachment "info.txt"
|
@@ -1170,8 +1192,8 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1170
1192
|
а вызывает заданный блок для всех возможных путей. Дело тут не в производительности,
|
1171
1193
|
дело в том, что +render+ вызовет +break+, как только файл не будет найден.
|
1172
1194
|
Содержимое и местонахождение шаблонов будет закэшировано, если приложение запущено не
|
1173
|
-
в режиме
|
1174
|
-
сумашедший метод.
|
1195
|
+
в режиме разработки (set :environment, :development). Вы должны помнить об этих нюансах,
|
1196
|
+
если пишите по-настоящему "сумашедший" метод.
|
1175
1197
|
|
1176
1198
|
== Конфигурация
|
1177
1199
|
|
@@ -1252,7 +1274,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1252
1274
|
[environment] текущее окружение, по умолчанию, значение <tt>ENV['RACK_ENV']</tt>
|
1253
1275
|
или <tt>"development"</tt>, если <tt>ENV['RACK_ENV']</tt> не доступна.
|
1254
1276
|
|
1255
|
-
[logging] использовать
|
1277
|
+
[logging] использовать логер.
|
1256
1278
|
|
1257
1279
|
[lock] создает блокировку для каждого запроса, которая гарантирует обработку
|
1258
1280
|
только одного запроса в текущий момент времени в Ruby процессе.
|
@@ -1268,7 +1290,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1268
1290
|
встроенным сервером.
|
1269
1291
|
|
1270
1292
|
[prefixed_redirects] добавлять или нет параметр <tt>request.script_name</tt> к редиректам,
|
1271
|
-
если не задан абсолютный путь. Таким
|
1293
|
+
если не задан абсолютный путь. Таким образом, <tt>redirect '/foo'</tt>
|
1272
1294
|
будет вести себя как <tt>redirect to('/foo')</tt>. Отключено по умолчанию.
|
1273
1295
|
|
1274
1296
|
[public] директория, откуда будут раздаваться статические файлы.
|
@@ -1278,7 +1300,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1278
1300
|
|
1279
1301
|
[root] корневая директория проекта.
|
1280
1302
|
|
1281
|
-
[raise_errors]
|
1303
|
+
[raise_errors] выбрасывать исключения (будет останавливать приложение).
|
1282
1304
|
|
1283
1305
|
[run] если включено, Sinatra будет самостоятельно запускать веб-сервер.
|
1284
1306
|
Не включайте, если используете rackup или аналогичные средства.
|
@@ -1292,9 +1314,9 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1292
1314
|
|
1293
1315
|
[sessions] включить сессии на основе кук (cookie).
|
1294
1316
|
|
1295
|
-
[show_exceptions] показывать
|
1317
|
+
[show_exceptions] показывать исключения/стек вызовов (stack trace) в браузере.
|
1296
1318
|
|
1297
|
-
[static]
|
1319
|
+
[static] должна ли Sinatra осуществлять раздачу статических файлов.
|
1298
1320
|
Отключите, когда используете какой-либо веб-сервер для этой цели.
|
1299
1321
|
Отключение значительно улучшит производительность приложения.
|
1300
1322
|
Включено по умолчанию.
|
@@ -1306,9 +1328,9 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1306
1328
|
Обработчики ошибок исполняются в том же контексте, что и маршруты, +before+-фильтры, а это означает, что всякие
|
1307
1329
|
прелести вроде <tt>haml</tt>, <tt>erb</tt>, <tt>halt</tt> и т.д. доступны и им.
|
1308
1330
|
|
1309
|
-
===
|
1331
|
+
=== Not Found
|
1310
1332
|
|
1311
|
-
Когда
|
1333
|
+
Когда выброшено исключение <tt>Sinatra::NotFound</tt>, или кодом ответа является 404,
|
1312
1334
|
то будет вызван <tt>not_found</tt> обработчик:
|
1313
1335
|
|
1314
1336
|
not_found do
|
@@ -1317,7 +1339,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1317
1339
|
|
1318
1340
|
=== Ошибки
|
1319
1341
|
|
1320
|
-
Обработчик ошибок +error+ будет вызван, когда исключение
|
1342
|
+
Обработчик ошибок +error+ будет вызван, когда исключение выброшено из блока маршрута, либо из фильтра.
|
1321
1343
|
Объект-исключение доступен как переменная <tt>sinatra.error</tt> в Rack:
|
1322
1344
|
|
1323
1345
|
error do
|
@@ -1356,7 +1378,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
1356
1378
|
'Boom'
|
1357
1379
|
end
|
1358
1380
|
|
1359
|
-
Sinatra устанавливает специальные <tt>not_found</tt> и <tt>error</tt> обработчики, когда
|
1381
|
+
Sinatra устанавливает специальные <tt>not_found</tt> и <tt>error</tt> обработчики, когда приложение запущено в режиме
|
1360
1382
|
разработки (окружение <tt>:development</tt>).
|
1361
1383
|
|
1362
1384
|
== Rack "прослойки"
|
@@ -1364,7 +1386,7 @@ Sinatra устанавливает специальные <tt>not_found</tt> и
|
|
1364
1386
|
Sinatra использует Rack[http://rack.rubyforge.org/], минимальный стандартный
|
1365
1387
|
интерфейс для веб-фреймворков на Ruby. Одной из самых интересных для разработчиков возможностей Rack
|
1366
1388
|
является поддержка "прослоек" ("middleware") — компонентов,
|
1367
|
-
"
|
1389
|
+
находящихся "между" сервером и вашим приложением, которые отслеживают и/или манипулируют
|
1368
1390
|
HTTP запросами/ответами для предоставления различной функциональности.
|
1369
1391
|
|
1370
1392
|
В Sinatra очень просто использовать такие "прослойки" с помощью метода +use+:
|
@@ -1391,7 +1413,7 @@ Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] DSL
|
|
1391
1413
|
Rack распространяется с различными стандартными "прослойками"
|
1392
1414
|
для логирования, отладки, маршрутизации URL, аутентификации, обработки сессий. Sinatra использует
|
1393
1415
|
многие из этих компонентов автоматически, основываясь на конфигурации, чтобы вам не приходилось
|
1394
|
-
|
1416
|
+
подключать (+use+) их вручную.
|
1395
1417
|
|
1396
1418
|
== Тестирование
|
1397
1419
|
|
@@ -1432,9 +1454,9 @@ Rack распространяется с различными стандартн
|
|
1432
1454
|
|
1433
1455
|
Описание своего приложения самым простейшим способом (с помощью DSL верхнего уровня, как в примерах выше)
|
1434
1456
|
работает отлично для крохотных приложений, но имеет множество недостатков, когда надо создать компоненты, такие как
|
1435
|
-
Rack middleware ("прослойки"), Rails metal, простые библиотеки с серверными компонентами,
|
1436
|
-
|
1437
|
-
DSL верхнего уровня загрязняет пространство имен <tt>Object</tt> и подразумевает стиль конфигурации
|
1457
|
+
Rack middleware ("прослойки"), Rails metal, простые библиотеки с серверными компонентами, расширения Sinatra.
|
1458
|
+
|
1459
|
+
DSL верхнего уровня "загрязняет" пространство имен <tt>Object</tt> и подразумевает стиль конфигурации
|
1438
1460
|
микро-приложения (например, единый файл приложения, ./public и
|
1439
1461
|
./views директории, создание логов, страницу деталей об исключениях
|
1440
1462
|
и т.д.). И тут на помощь приходит Sinatra::Base:
|
@@ -1450,13 +1472,13 @@ DSL верхнего уровня загрязняет пространство
|
|
1450
1472
|
end
|
1451
1473
|
end
|
1452
1474
|
|
1453
|
-
Методы, доступные Sinatra::Base
|
1475
|
+
Методы, доступные Sinatra::Base подклассам идентичны тем, что доступны
|
1454
1476
|
в DSL верхнего уровня. Большинство приложений верхнего уровня могут быть
|
1455
1477
|
конвертированы в Sinatra::Base компоненты с помощью двух модификаций:
|
1456
1478
|
|
1457
1479
|
* Вы должны подключать <tt>sinatra/base</tt> вместо +sinatra+,
|
1458
1480
|
иначе все методы предоставляемые Sinatra будут импортированы в глобальное пространство имен.
|
1459
|
-
* Поместите все маршруты, обработчики ошибок, фильтры и опции в
|
1481
|
+
* Поместите все маршруты, обработчики ошибок, фильтры и опции в подкласс Sinatra::Base.
|
1460
1482
|
|
1461
1483
|
<tt>Sinatra::Base</tt> — это чистый лист. Большинство опций, включая встроенный сервер, по умолчанию отключены.
|
1462
1484
|
Смотрите {Опции и Конфигурация}[http://www.sinatrarb.com/configuration.html] для детальной информации
|
@@ -1540,8 +1562,8 @@ Rack-совместимый сервер приложений.
|
|
1540
1562
|
Вот несколько причин, по которым вы, возможно, захотите использовать <tt>config.ru</tt>:
|
1541
1563
|
|
1542
1564
|
* вы хотите разворачивать свое приложение на различных Rack-совместимых серверах (Passenger, Unicorn,
|
1543
|
-
Heroku, ...)
|
1544
|
-
* вы хотите использовать более одного
|
1565
|
+
Heroku, ...);
|
1566
|
+
* вы хотите использовать более одного подкласса <tt>Sinatra::Base</tt>;
|
1545
1567
|
* вы хотите использовать Sinatra только в качестве "прослойки" Rack.
|
1546
1568
|
|
1547
1569
|
<b>Совсем необязательно переходить на использование <tt>config.ru</tt> лишь потому, что вы стали
|
@@ -1551,7 +1573,7 @@ Rack-совместимый сервер приложений.
|
|
1551
1573
|
=== Использование Sinatra в качестве "прослойки"
|
1552
1574
|
|
1553
1575
|
Не только сам Sinatra может использовать "прослойки" Rack, но и любое Sinatra приложение
|
1554
|
-
само может быть добавлено к любому Rack
|
1576
|
+
само может быть добавлено к любому Rack endpoint в качестве "прослойки". Этим endpoint (конечной точкой)
|
1555
1577
|
может быть другое Sinatra приложение, или приложение, основанное на Rack (Rails/Ramaze/Camping/...):
|
1556
1578
|
|
1557
1579
|
require 'sinatra/base'
|
@@ -1590,10 +1612,9 @@ Rack-совместимый сервер приложений.
|
|
1590
1612
|
|
1591
1613
|
=== Область видимости приложения / класса
|
1592
1614
|
|
1593
|
-
Любое Sinatra приложение соответствует
|
1594
|
-
используете DSL верхнего
|
1595
|
-
|
1596
|
-
Sinatra::Application, иначе это будет сабкласс, который вы создали вручную.
|
1615
|
+
Любое Sinatra приложение соответствует подклассу Sinatra::Base. Если вы
|
1616
|
+
используете DSL верхнего уровня (<tt>require 'sinatra'</tt>), то этим классом будет
|
1617
|
+
Sinatra::Application, иначе это будет подкласс, который вы создали вручную.
|
1597
1618
|
На уровне класса вам будут доступны такие методы, как +get+ или +before+, но вы
|
1598
1619
|
не сможете иметь доступ к объектам +request+ или +session+, так как существует
|
1599
1620
|
только один класс приложения для всех запросов.
|
@@ -1612,15 +1633,15 @@ Sinatra::Application, иначе это будет сабкласс, котор
|
|
1612
1633
|
|
1613
1634
|
У вас будет область видимости приложения внутри:
|
1614
1635
|
|
1615
|
-
*
|
1616
|
-
*
|
1617
|
-
*
|
1618
|
-
*
|
1636
|
+
* тела вашего класса приложения;
|
1637
|
+
* методов, определенных расширениями;
|
1638
|
+
* блока, переданного в +helpers+;
|
1639
|
+
* блоков, использованных как значения для +set+.
|
1619
1640
|
|
1620
1641
|
Вы можете получить доступ к объекту области видимости (классу приложения) следующими способами:
|
1621
1642
|
|
1622
|
-
* объект, переданный блокам конфигурации (<tt>configure { |c| ... }</tt>)
|
1623
|
-
* +settings+ внутри области видимости
|
1643
|
+
* через объект, переданный блокам конфигурации (<tt>configure { |c| ... }</tt>);
|
1644
|
+
* +settings+ внутри области видимости запроса.
|
1624
1645
|
|
1625
1646
|
=== Область видимости запроса/экземпляра
|
1626
1647
|
|
@@ -1628,7 +1649,7 @@ Sinatra::Application, иначе это будет сабкласс, котор
|
|
1628
1649
|
и все блоки обработчика будут запущены в этом контексте. В этой области
|
1629
1650
|
видимости вам доступны +request+ и +session+ объекты, вызовы методов
|
1630
1651
|
рендеринга, такие как +erb+ или +haml+. Вы можете получить доступ к
|
1631
|
-
области видимости приложения из контекста запроса, используя
|
1652
|
+
области видимости приложения из контекста запроса, используя метод-помощник +settings+:
|
1632
1653
|
|
1633
1654
|
class MyApp < Sinatra::Base
|
1634
1655
|
# Я в области видимости приложения!
|
@@ -1647,10 +1668,10 @@ Sinatra::Application, иначе это будет сабкласс, котор
|
|
1647
1668
|
|
1648
1669
|
У вас будет область видимости запроса внутри:
|
1649
1670
|
|
1650
|
-
* get/head/post/put/delete/options
|
1651
|
-
* before/after
|
1652
|
-
*
|
1653
|
-
*
|
1671
|
+
* get/head/post/put/delete/options блоков;
|
1672
|
+
* before/after фильтрах;
|
1673
|
+
* методах-помощниках;
|
1674
|
+
* шаблонах/отображениях.
|
1654
1675
|
|
1655
1676
|
=== Область видимости делегирования
|
1656
1677
|
|
@@ -1664,8 +1685,8 @@ Sinatra::Application, иначе это будет сабкласс, котор
|
|
1664
1685
|
|
1665
1686
|
У вас будет контекст делегирования внутри:
|
1666
1687
|
|
1667
|
-
*
|
1668
|
-
*
|
1688
|
+
* привязки верхнего уровня, если вы сделали <tt>require 'sinatra'</tt>;
|
1689
|
+
* объекта, расширенного с помощью <tt>Sinatra::Delegator</tt>.
|
1669
1690
|
|
1670
1691
|
Посмотрите сами в код: тут
|
1671
1692
|
{Sinatra::Delegator примесь}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
|
@@ -1679,12 +1700,12 @@ Sinatra приложения могут быть запущены напряму
|
|
1679
1700
|
|
1680
1701
|
Опции включают:
|
1681
1702
|
|
1682
|
-
-h #
|
1683
|
-
-p #
|
1684
|
-
-o #
|
1685
|
-
-e #
|
1686
|
-
-s #
|
1687
|
-
-x # включить
|
1703
|
+
-h # раздел помощи
|
1704
|
+
-p # указание порта (по умолчанию 4567)
|
1705
|
+
-o # указание хоста (по умолчанию 0.0.0.0)
|
1706
|
+
-e # указание окружения, режима (по умолчанию development)
|
1707
|
+
-s # указание rack сервера/обработчика (по умолчанию thin)
|
1708
|
+
-x # включить мьютекс-блокировку (по умолчанию выключена)
|
1688
1709
|
|
1689
1710
|
== Системные требования
|
1690
1711
|
|
@@ -1695,12 +1716,12 @@ Sinatra приложения могут быть запущены напряму
|
|
1695
1716
|
этой версии, рекомендуем обновиться до 1.9.2 или перейти на JRuby или Rubinius.
|
1696
1717
|
|
1697
1718
|
[ Ruby 1.9.2 ]
|
1698
|
-
1.9.2 поддерживается и
|
1719
|
+
1.9.2 поддерживается и рекомендована к использованию. Заметьте, что Radius и Markaby
|
1699
1720
|
пока несовместимы с 1.9.2. Не используйте 1.9.2p0, известно, что эта
|
1700
1721
|
версия весьма не стабильна при использовании Sinatra.
|
1701
1722
|
|
1702
1723
|
[ Rubinius ]
|
1703
|
-
Rubinius официально поддерживается (Rubinius >= 1.2.3),
|
1724
|
+
Rubinius официально поддерживается (Rubinius >= 1.2.3), всё, включая все
|
1704
1725
|
языки шаблонов, работает.
|
1705
1726
|
|
1706
1727
|
[ JRuby ]
|
@@ -1712,37 +1733,35 @@ Sinatra приложения могут быть запущены напряму
|
|
1712
1733
|
|
1713
1734
|
<b>Ruby 1.8.6 больше не поддерживается.</b>
|
1714
1735
|
|
1715
|
-
Мы также следим за
|
1736
|
+
Мы также следим за предстоящими к выходу версиями Ruby.
|
1716
1737
|
|
1717
1738
|
Следующие реализации Ruby не поддерживаются официально, но известно, что на
|
1718
1739
|
них запускается Sinatra:
|
1719
1740
|
|
1720
|
-
*
|
1721
|
-
* MacRuby, Maglev, IronRuby
|
1722
|
-
* Ruby 1.9.0 и 1.9.1
|
1723
|
-
* Ruby 1.8.6 с помощью {backports}[https://github.com/marcandre/backports/#readme]
|
1741
|
+
* старые версии JRuby и Rubinius;
|
1742
|
+
* MacRuby, Maglev, IronRuby;
|
1743
|
+
* Ruby 1.9.0 и 1.9.1;
|
1744
|
+
* Ruby 1.8.6 с помощью {backports}[https://github.com/marcandre/backports/#readme].
|
1724
1745
|
|
1725
1746
|
То, что версия официально не поддерживается, означает, что, если что-то не
|
1726
|
-
работает на этой версии, а на поддерживаемой
|
1727
|
-
что это не наша проблема, а их.
|
1747
|
+
работает на этой версии, а на поддерживаемой работает - это не наша проблема, а их.
|
1728
1748
|
|
1729
1749
|
Мы также запускаем наши CI-тесты на последней версии Ruby (предстоящий 1.9.3),
|
1730
1750
|
но мы не можем ничего гарантировать, так как она постоянно развивается.
|
1731
1751
|
Предполагается, что 1.9.3p0 будет поддерживаться.
|
1732
1752
|
|
1733
|
-
Sinatra
|
1734
|
-
реализацией Ruby.
|
1753
|
+
Sinatra должна работать на любой операционной системе, в которой есть одна из указанных выше версий Ruby.
|
1735
1754
|
|
1736
1755
|
== На острие
|
1737
1756
|
|
1738
1757
|
Если вы хотите использовать самый последний код Sinatra, не бойтесь запускать
|
1739
|
-
свое приложение вместе
|
1758
|
+
свое приложение вместе из master ветки Sinatra, она весьма стабильна.
|
1740
1759
|
|
1741
1760
|
Мы также время от времени выпускаем предварительные версии, так что вы можете делать так:
|
1742
1761
|
|
1743
1762
|
gem install sinatra --pre
|
1744
1763
|
|
1745
|
-
Чтобы воспользоваться некоторыми самыми последними
|
1764
|
+
Чтобы воспользоваться некоторыми самыми последними возможностями.
|
1746
1765
|
|
1747
1766
|
=== С помощью Bundler
|
1748
1767
|
|
@@ -1766,7 +1785,7 @@ Sinatra должен работать на любой операционной
|
|
1766
1785
|
в этом файле. Однако, непосредственные зависимости Sinatra (Rack и Tilt) Bundler
|
1767
1786
|
автоматически скачает и добавит.
|
1768
1787
|
|
1769
|
-
Теперь вы можете запускать свое приложение
|
1788
|
+
Теперь вы можете запускать свое приложение так:
|
1770
1789
|
|
1771
1790
|
bundle exec ruby myapp.rb
|
1772
1791
|
|
@@ -1804,10 +1823,10 @@ SemVerTag.
|
|
1804
1823
|
|
1805
1824
|
== Дальнейшее чтение
|
1806
1825
|
|
1807
|
-
* {
|
1826
|
+
* {Веб-сайт проекта}[http://www.sinatrarb.com/] - Дополнительная документация,
|
1808
1827
|
новости и ссылки на другие ресурсы.
|
1809
|
-
* {Участие}[http://www.sinatrarb.com/contributing] -
|
1810
|
-
* {Слежение за
|
1828
|
+
* {Участие в проекте}[http://www.sinatrarb.com/contributing] - Обнаружили баг? Нужна помощь? Написали патч?
|
1829
|
+
* {Слежение за проблемами/ошибками}[http://github.com/sinatra/sinatra/issues]
|
1811
1830
|
* {Twitter}[http://twitter.com/sinatra]
|
1812
|
-
* {
|
1813
|
-
* {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] on http://freenode.net
|
1831
|
+
* {Группы рассылки}[http://groups.google.com/group/sinatrarb/topics]
|
1832
|
+
* {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] on http://freenode.net
|