sinatra 1.2.0.a → 1.2.0.c
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- data/AUTHORS +2 -0
- data/CHANGES +69 -1
- data/Gemfile +35 -0
- data/Gemfile.lock +74 -0
- data/README.de.rdoc +16 -16
- data/README.es.rdoc +360 -80
- data/README.fr.rdoc +16 -16
- data/README.hu.rdoc +4 -4
- data/README.jp.rdoc +16 -16
- data/README.pt-br.rdoc +6 -6
- data/README.rdoc +629 -95
- data/README.ru.rdoc +317 -103
- data/README.zh.rdoc +16 -16
- data/Rakefile +6 -14
- data/lib/sinatra/base.rb +70 -30
- data/lib/sinatra/showexceptions.rb +25 -0
- data/sinatra.gemspec +8 -18
- data/test/builder_test.rb +6 -0
- data/test/coffee_test.rb +1 -1
- data/test/erubis_test.rb +6 -0
- data/test/haml_test.rb +2 -1
- data/test/helpers_test.rb +53 -0
- data/test/less_test.rb +6 -0
- data/test/liquid_test.rb +2 -1
- data/test/markaby_test.rb +2 -1
- data/test/markdown_test.rb +3 -2
- data/test/nokogiri_test.rb +2 -1
- data/test/radius_test.rb +3 -2
- data/test/rdoc_test.rb +2 -1
- data/test/routing_test.rb +49 -5
- data/test/sass_test.rb +1 -1
- data/test/scss_test.rb +1 -1
- data/test/slim_test.rb +2 -1
- data/test/templates_test.rb +43 -0
- data/test/textile_test.rb +2 -1
- data/test/views/a/in_a.str +1 -0
- data/test/views/b/in_b.str +1 -0
- data/test/views/calc.html.erb +1 -0
- metadata +22 -223
data/README.ru.rdoc
CHANGED
@@ -94,7 +94,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
94
94
|
end
|
95
95
|
|
96
96
|
get '/foo' do
|
97
|
-
# соответствует
|
97
|
+
# соответствует non-songbird браузерам
|
98
98
|
end
|
99
99
|
|
100
100
|
Другими доступными условиями являются +host_name+ и +provides+:
|
@@ -126,7 +126,7 @@ Sinatra — это предметно-ориентированный язык (D
|
|
126
126
|
=== Возвращаемые значения
|
127
127
|
|
128
128
|
Возвращаемое значение блока маршрута ограничивается телом ответа, которое будет передано HTTP клиенту,
|
129
|
-
или следующей
|
129
|
+
или следующей "прослойкой" (middleware, промежуточная программа) в Rack стеке. Чаще всего это строка, как в вышеизложенных примерах.
|
130
130
|
Но и другие значения также приемлемы.
|
131
131
|
|
132
132
|
Вы можете вернуть любой объект, который будет либо корректным Rack ответом, Rack
|
@@ -172,9 +172,9 @@ Sinatra — это предметно-ориентированный язык (D
|
|
172
172
|
|
173
173
|
=== Haml шаблоны
|
174
174
|
|
175
|
-
|
175
|
+
<tt>haml</tt> gem/библиотека необходима для рендеринга HAML шаблонов:
|
176
176
|
|
177
|
-
|
177
|
+
# Вам нужно будет подключить haml gem в приложении
|
178
178
|
require 'haml'
|
179
179
|
|
180
180
|
get '/' do
|
@@ -197,33 +197,44 @@ Haml gem/библиотека необходима для рендеринга H
|
|
197
197
|
|
198
198
|
=== Erb шаблоны
|
199
199
|
|
200
|
-
|
200
|
+
# Вам нужно будет подключить erb в приложении
|
201
201
|
require 'erb'
|
202
202
|
|
203
203
|
get '/' do
|
204
204
|
erb :index
|
205
205
|
end
|
206
206
|
|
207
|
-
Отрисует <tt>./views/index.erb</tt
|
207
|
+
Отрисует <tt>./views/index.erb</tt>.
|
208
208
|
|
209
209
|
=== Erubis шаблоны
|
210
210
|
|
211
|
-
|
211
|
+
<tt>erubis</tt> gem/библиотека необходима для рендеринга Erubis шаблонов:
|
212
212
|
|
213
|
-
|
213
|
+
# Вам нужно будет подключить Erubis в приложении
|
214
214
|
require 'erubis'
|
215
215
|
|
216
216
|
get '/' do
|
217
217
|
erubis :index
|
218
218
|
end
|
219
219
|
|
220
|
-
Отрисует <tt>./views/index.erubis</tt
|
220
|
+
Отрисует <tt>./views/index.erubis</tt>.
|
221
|
+
|
222
|
+
Также возможно заменить Erb на Erubis:
|
223
|
+
|
224
|
+
require 'erubis'
|
225
|
+
Tilt.register :erb, Tilt[:erubis]
|
226
|
+
|
227
|
+
get '/' do
|
228
|
+
erb :index
|
229
|
+
end
|
230
|
+
|
231
|
+
Отрисует <tt>./views/index.erb</tt> с помощью Erubis.
|
221
232
|
|
222
233
|
=== Builder шаблоны
|
223
234
|
|
224
|
-
|
235
|
+
<tt>builder</tt> gem/библиотека необходима для рендеринга builder шаблонов:
|
225
236
|
|
226
|
-
|
237
|
+
# Вам нужно будет подключить builder в приложении
|
227
238
|
require 'builder'
|
228
239
|
|
229
240
|
get '/' do
|
@@ -234,9 +245,9 @@ Builder gem/библиотека необходима для рендеринг
|
|
234
245
|
|
235
246
|
=== Nokogiri шаблоны
|
236
247
|
|
237
|
-
|
248
|
+
<tt>nokogiri</tt> gem/библиотека необходима для рендеринга nokogiri шаблонов:
|
238
249
|
|
239
|
-
|
250
|
+
# Вам нужно будет подключить nokogiri в приложении
|
240
251
|
require 'nokogiri'
|
241
252
|
|
242
253
|
get '/' do
|
@@ -247,9 +258,9 @@ Nokogiri gem/библиотека необходима для рендеринг
|
|
247
258
|
|
248
259
|
=== Sass шаблоны
|
249
260
|
|
250
|
-
|
261
|
+
<tt>haml</tt> gem/библиотека необходима для рендеринга Sass шаблонов:
|
251
262
|
|
252
|
-
|
263
|
+
# Вам нужно будет подключить haml или sass в приложении
|
253
264
|
require 'sass'
|
254
265
|
|
255
266
|
get '/stylesheet.css' do
|
@@ -271,9 +282,9 @@ Haml gem/библиотека необходима для рендеринга S
|
|
271
282
|
|
272
283
|
=== Scss шаблоны
|
273
284
|
|
274
|
-
|
285
|
+
<tt>haml</tt> gem/библиотека необходима для рендеринга Scss шаблонов:
|
275
286
|
|
276
|
-
|
287
|
+
# Вам нужно будет подключить haml или sass в приложении
|
277
288
|
require 'sass'
|
278
289
|
|
279
290
|
get '/stylesheet.css' do
|
@@ -295,9 +306,9 @@ Haml gem/библиотека необходима для рендеринга S
|
|
295
306
|
|
296
307
|
=== Less шаблоны
|
297
308
|
|
298
|
-
less gem/библиотека необходима для рендеринга Less шаблонов:
|
309
|
+
<tt>less</tt> gem/библиотека необходима для рендеринга Less шаблонов:
|
299
310
|
|
300
|
-
|
311
|
+
# Вам нужно будет подключить less в приложении
|
301
312
|
require 'less'
|
302
313
|
|
303
314
|
get '/stylesheet.css' do
|
@@ -308,9 +319,9 @@ less gem/библиотека необходима для рендеринга L
|
|
308
319
|
|
309
320
|
=== Liquid шаблоны
|
310
321
|
|
311
|
-
liquid gem/библиотека необходима для рендеринга liquid шаблонов:
|
322
|
+
<tt>liquid</tt> gem/библиотека необходима для рендеринга liquid шаблонов:
|
312
323
|
|
313
|
-
|
324
|
+
# Вам нужно будет подключить liquid в приложении
|
314
325
|
require 'liquid'
|
315
326
|
|
316
327
|
get '/' do
|
@@ -326,9 +337,9 @@ liquid gem/библиотека необходима для рендеринга
|
|
326
337
|
|
327
338
|
=== Markdown шаблоны
|
328
339
|
|
329
|
-
rdiscount gem/библиотека необходима для рендеринга Markdown шаблонов:
|
340
|
+
<tt>rdiscount</tt> gem/библиотека необходима для рендеринга Markdown шаблонов:
|
330
341
|
|
331
|
-
|
342
|
+
# Вам нужно будет подключить rdiscount в приложении
|
332
343
|
require "rdiscount"
|
333
344
|
|
334
345
|
get '/' do
|
@@ -338,21 +349,58 @@ rdiscount gem/библиотека необходима для рендерин
|
|
338
349
|
Отрисует <tt>./views/index.markdown</tt> (+md+ и +mkd+ также являются допустимыми файловыми
|
339
350
|
расширениями).
|
340
351
|
|
341
|
-
В
|
342
|
-
использовать этот шаблон совместно с другим
|
352
|
+
В Markdown невозможно вызывать методы или передавать локальные переменные.
|
353
|
+
Следовательно, вам, скорее всего, придется использовать этот шаблон совместно с другим
|
354
|
+
движком рендеринга:
|
343
355
|
|
344
356
|
erb :overview, :locals => { :text => markdown(:introduction) }
|
345
357
|
|
346
|
-
Заметьте, что вы можете вызывать метод markdown из других шаблонов:
|
358
|
+
Заметьте, что вы можете вызывать метод +markdown+ из других шаблонов:
|
347
359
|
|
348
360
|
%h1 Hello From Haml!
|
349
361
|
%p= markdown(:greetings)
|
350
362
|
|
363
|
+
Вы не можете вызывать Ruby из Markdown, соответственно, вы не можете использовать
|
364
|
+
лэйаут-шаблоны (layouts) на Markdown. Тем не менее, есть возможность использовать один
|
365
|
+
движок рендеринга для шаблона, а другой для лэйаута с помощью опции `:layout_engine`:
|
366
|
+
|
367
|
+
get '/' do
|
368
|
+
markdown :index, :layout_engine => :erb
|
369
|
+
end
|
370
|
+
|
371
|
+
Отрисует <tt>./views/index.md</tt> с <tt>./views/layout.erb</tt> в качестве
|
372
|
+
лэйаута.
|
373
|
+
|
374
|
+
Также вы можете задать такие опции рендеринга глобально:
|
375
|
+
|
376
|
+
set :markdown, :layout_engine => :haml, :layout => :post
|
377
|
+
|
378
|
+
get '/' do
|
379
|
+
markdown :index
|
380
|
+
end
|
381
|
+
|
382
|
+
Отрисует <tt>./views/index.md</tt> (и любой другой шаблон на Markdown) с
|
383
|
+
<tt>./views/post.haml</tt> в качестве лэйаута.
|
384
|
+
|
385
|
+
Также возможно обрабатывать Markdown с помощью BlueCloth, а не RDiscount:
|
386
|
+
|
387
|
+
require 'bluecloth'
|
388
|
+
|
389
|
+
Tilt.register 'markdown', BlueClothTemplate
|
390
|
+
Tilt.register 'mkd', BlueClothTemplate
|
391
|
+
Tilt.register 'md', BlueClothTemplate
|
392
|
+
|
393
|
+
get '/' do
|
394
|
+
markdown :index
|
395
|
+
end
|
396
|
+
|
397
|
+
Отрисует <tt>./views/index.md</tt> с помощью BlueCloth.
|
398
|
+
|
351
399
|
=== Textile шаблоны
|
352
400
|
|
353
|
-
RedCloth gem/библиотека необходима для рендеринга Textile шаблонов:
|
401
|
+
<tt>RedCloth</tt> gem/библиотека необходима для рендеринга Textile шаблонов:
|
354
402
|
|
355
|
-
|
403
|
+
# Вам нужно будет подключить redcloth в приложении
|
356
404
|
require "redcloth"
|
357
405
|
|
358
406
|
get '/' do
|
@@ -361,21 +409,43 @@ RedCloth gem/библиотека необходима для рендеринг
|
|
361
409
|
|
362
410
|
Отрисует <tt>./views/index.textile</tt>.
|
363
411
|
|
364
|
-
В
|
365
|
-
использовать этот шаблон совместно с другим движком рендеринга:
|
412
|
+
В Textile невозможно вызывать методы или передавать локальные переменные. Следовательно, вам, скорее всего,
|
413
|
+
придется использовать этот шаблон совместно с другим движком рендеринга:
|
366
414
|
|
367
415
|
erb :overview, :locals => { :text => textile(:introduction) }
|
368
416
|
|
369
|
-
Заметьте, что вы можете вызывать метод textile из других шаблонов:
|
417
|
+
Заметьте, что вы можете вызывать метод +textile+ из других шаблонов:
|
370
418
|
|
371
419
|
%h1 Hello From Haml!
|
372
420
|
%p= textile(:greetings)
|
373
421
|
|
422
|
+
Вы не можете вызывать Ruby из Textile, соответственно, вы не можете использовать
|
423
|
+
лэйаут-шаблоны на Textile. Тем не менее, есть возможность использовать один
|
424
|
+
движок рендеринга для шаблона, а другой для лэйаута с помощью опции `:layout_engine`:
|
425
|
+
|
426
|
+
get '/' do
|
427
|
+
textile :index, :layout_engine => :erb
|
428
|
+
end
|
429
|
+
|
430
|
+
Отрисует <tt>./views/index.textile</tt> с <tt>./views/layout.erb</tt> в качестве
|
431
|
+
лэйаута.
|
432
|
+
|
433
|
+
Также вы можете задать такие опции рендеринга глобально:
|
434
|
+
|
435
|
+
set :textile, :layout_engine => :haml, :layout => :post
|
436
|
+
|
437
|
+
get '/' do
|
438
|
+
textile :index
|
439
|
+
end
|
440
|
+
|
441
|
+
Отрисует <tt>./views/index.textile</tt> (и любой другой шаблон на Textile) с
|
442
|
+
<tt>./views/post.haml</tt> в качестве лэйаута.
|
443
|
+
|
374
444
|
=== RDoc шаблоны
|
375
445
|
|
376
|
-
|
446
|
+
<tt>rdoc</tt> gem/библиотека необходима для рендеринга RDoc шаблонов:
|
377
447
|
|
378
|
-
|
448
|
+
# Вам нужно будет подключить rdoc в приложении
|
379
449
|
require "rdoc"
|
380
450
|
|
381
451
|
get '/' do
|
@@ -384,21 +454,43 @@ RDoc gem/библиотека необходима для рендеринга R
|
|
384
454
|
|
385
455
|
Отрисует <tt>./views/index.rdoc</tt>.
|
386
456
|
|
387
|
-
В
|
388
|
-
использовать этот шаблон совместно с другим движком рендеринга:
|
457
|
+
В RDoc невозможно вызывать методы или передавать локальные переменные. Следовательно, вам, скорее всего,
|
458
|
+
придется использовать этот шаблон совместно с другим движком рендеринга:
|
389
459
|
|
390
460
|
erb :overview, :locals => { :text => rdoc(:introduction) }
|
391
461
|
|
392
|
-
Заметьте, что вы можете вызывать метод rdoc из других шаблонов:
|
462
|
+
Заметьте, что вы можете вызывать метод +rdoc+ из других шаблонов:
|
393
463
|
|
394
464
|
%h1 Hello From Haml!
|
395
465
|
%p= rdoc(:greetings)
|
396
466
|
|
467
|
+
Вы не можете вызывать Ruby из RDoc, соответственно, вы не можете использовать
|
468
|
+
лэйаут-шаблоны на RDoc. Тем не менее, есть возможность использовать один
|
469
|
+
движок рендеринга для шаблона, а другой для лэйаута с помощью опции `:layout_engine`:
|
470
|
+
|
471
|
+
get '/' do
|
472
|
+
rdoc :index, :layout_engine => :erb
|
473
|
+
end
|
474
|
+
|
475
|
+
Отрисует <tt>./views/index.rdoc</tt> с <tt>./views/layout.erb</tt> в качестве
|
476
|
+
лэйаута.
|
477
|
+
|
478
|
+
Также вы можете задать такие опции рендеринга глобально:
|
479
|
+
|
480
|
+
set :rdoc, :layout_engine => :haml, :layout => :post
|
481
|
+
|
482
|
+
get '/' do
|
483
|
+
rdoc :index
|
484
|
+
end
|
485
|
+
|
486
|
+
Отрисует <tt>./views/index.rdoc</tt> (и любой другой шаблон на RDoc) с
|
487
|
+
<tt>./views/post.haml</tt> в качестве лэйаута.
|
488
|
+
|
397
489
|
=== Radius шаблоны
|
398
490
|
|
399
|
-
radius gem/библиотека необходима для рендеринга Radius шаблонов:
|
491
|
+
<tt>radius</tt> gem/библиотека необходима для рендеринга Radius шаблонов:
|
400
492
|
|
401
|
-
|
493
|
+
# Вам нужно будет подключить radius в приложении
|
402
494
|
require 'radius'
|
403
495
|
|
404
496
|
get '/' do
|
@@ -414,9 +506,9 @@ radius gem/библиотека необходима для рендеринга
|
|
414
506
|
|
415
507
|
=== Markaby шаблоны
|
416
508
|
|
417
|
-
markaby gem/библиотека необходима для рендеринга Markaby шаблонов:
|
509
|
+
<tt>markaby</tt> gem/библиотека необходима для рендеринга Markaby шаблонов:
|
418
510
|
|
419
|
-
|
511
|
+
# Вам нужно будет подключить markaby в приложении
|
420
512
|
require 'markaby'
|
421
513
|
|
422
514
|
get '/' do
|
@@ -425,8 +517,7 @@ markaby gem/библиотека необходима для рендеринг
|
|
425
517
|
|
426
518
|
Отрисует <tt>./views/index.mab</tt>.
|
427
519
|
|
428
|
-
|
429
|
-
markaby шаблоны:
|
520
|
+
Вы также можете использовать внутристроковые Markaby шаблоны:
|
430
521
|
|
431
522
|
get '/' do
|
432
523
|
markaby { h1 "Welcome!" }
|
@@ -434,9 +525,9 @@ markaby шаблоны:
|
|
434
525
|
|
435
526
|
=== Slim шаблоны
|
436
527
|
|
437
|
-
slim gem/библиотека необходима для рендеринга slim шаблонов:
|
528
|
+
<tt>slim</tt> gem/библиотека необходима для рендеринга slim шаблонов:
|
438
529
|
|
439
|
-
|
530
|
+
# Вам нужно будет подключить slim в приложении
|
440
531
|
require 'slim'
|
441
532
|
|
442
533
|
get '/' do
|
@@ -447,9 +538,18 @@ slim gem/библиотека необходима для рендеринга s
|
|
447
538
|
|
448
539
|
=== CoffeeScript шаблоны
|
449
540
|
|
450
|
-
coffee-script gem/библиотека и
|
541
|
+
Вам понадобится <tt>coffee-script</tt> gem/библиотека и что-то <b>одно</b> из следующего списка,
|
542
|
+
чтобы запускать JavaScript:
|
543
|
+
|
544
|
+
* +node+ (из Node.js)
|
545
|
+
* вы можете использовать OSX (есть встроенные средства для выполнения JavaScript)
|
546
|
+
* +therubyracer+ gem/библиотека
|
547
|
+
|
548
|
+
Подробнее смотрите на {странице проекта}[http://github.com/josh/ruby-coffee-script].
|
451
549
|
|
452
|
-
|
550
|
+
Таким образом вы можете использовать CoffeeScript шаблоны.
|
551
|
+
|
552
|
+
# Вам нужно будет подключить coffee-script в приложении
|
453
553
|
require 'coffee-script'
|
454
554
|
|
455
555
|
get '/application.js' do
|
@@ -458,18 +558,18 @@ coffee-script gem/библиотека и `coffee` бинарный файл н
|
|
458
558
|
|
459
559
|
Отрисует <tt>./views/application.coffee</tt>.
|
460
560
|
|
461
|
-
===
|
561
|
+
=== Встроенные шаблоны
|
462
562
|
|
463
563
|
get '/' do
|
464
564
|
haml '%div.title Hello World'
|
465
565
|
end
|
466
566
|
|
467
|
-
Отрисует
|
567
|
+
Отрисует встроенный (строчный) шаблон.
|
468
568
|
|
469
569
|
=== Доступ к переменным в шаблонах
|
470
570
|
|
471
|
-
Шаблоны интерпретируются в том же контексте, что и обработчики маршрутов. Переменные
|
472
|
-
установленные в
|
571
|
+
Шаблоны интерпретируются в том же контексте, что и обработчики маршрутов. Переменные экземпляра,
|
572
|
+
установленные в процессе обработки маршрутов, будут доступны напрямую в шаблонах:
|
473
573
|
|
474
574
|
get '/:id' do
|
475
575
|
@foo = Foo.find(params[:id])
|
@@ -483,7 +583,7 @@ coffee-script gem/библиотека и `coffee` бинарный файл н
|
|
483
583
|
haml '%h1= foo.name', :locals => { :foo => foo }
|
484
584
|
end
|
485
585
|
|
486
|
-
Это
|
586
|
+
Это обычный подход, когда шаблоны рендерятся как частные (partials) из других шаблонов.
|
487
587
|
|
488
588
|
=== Вложенные шаблоны
|
489
589
|
|
@@ -504,7 +604,7 @@ coffee-script gem/библиотека и `coffee` бинарный файл н
|
|
504
604
|
@@ index
|
505
605
|
%div.title Hello world!!!!!
|
506
606
|
|
507
|
-
Заметьте: Вложенные шаблоны, определенные в файле-исходнике, который подключил
|
607
|
+
Заметьте: Вложенные шаблоны, определенные в файле-исходнике, который подключил Sinatra, будут
|
508
608
|
автоматически загружены. Вызовите <tt>enable :inline_templates</tt> напрямую, если у вас вложенные
|
509
609
|
шаблоны в других файлах.
|
510
610
|
|
@@ -525,16 +625,42 @@ coffee-script gem/библиотека и `coffee` бинарный файл н
|
|
525
625
|
end
|
526
626
|
|
527
627
|
Если шаблон с именем "layout" существует, то он будет использован каждый раз,
|
528
|
-
когда шаблоны будут отрисовываться. Вы можете
|
628
|
+
когда шаблоны будут отрисовываться. Вы можете отключать лэйаут в каждом конкретном случае с помощью
|
629
|
+
<tt>:layout => false</tt> или отключить его для всего приложения, например, так: <tt>set :haml, :layout => false</tt>.
|
529
630
|
|
530
631
|
get '/' do
|
531
632
|
haml :index, :layout => !request.xhr?
|
532
633
|
end
|
533
634
|
|
534
|
-
|
635
|
+
=== Привязка файловых расширений
|
636
|
+
|
637
|
+
Чтобы связать расширение файла и движок рендеринга, используйте
|
638
|
+
<tt>Tilt.register</tt>. Например, если вы хотите использовать расширение +tt+
|
639
|
+
для шаблонов Textile:
|
640
|
+
|
641
|
+
Tilt.register :tt, Tilt[:textile]
|
642
|
+
|
643
|
+
=== Добавление собственного движка рендеринга
|
644
|
+
|
645
|
+
Сначала зарегистрируйте свой движок в Tilt, затем создайте метод, отвечающий за отрисовку:
|
646
|
+
|
647
|
+
Tilt.register :myat, MyAwesomeTemplateEngine
|
648
|
+
|
649
|
+
helpers do
|
650
|
+
def myat(*args) render(:myat, *args) end
|
651
|
+
end
|
652
|
+
|
653
|
+
get '/' do
|
654
|
+
myat :index
|
655
|
+
end
|
656
|
+
|
657
|
+
Отрисует <tt>./views/index.myat</tt>. Чтобы узнать больше о Tilt,
|
658
|
+
смотрите https://github.com/rtomayko/tilt
|
535
659
|
|
536
|
-
|
537
|
-
|
660
|
+
== Методы-помощники
|
661
|
+
|
662
|
+
Используйте метод <tt>helpers</tt>, чтобы определить методы-помощники, которые
|
663
|
+
в дальнейшем можно будет использовать в обработчиках маршрутов и шаблонах:
|
538
664
|
|
539
665
|
helpers do
|
540
666
|
def bar(name)
|
@@ -641,23 +767,23 @@ After-фильтры выполняются после каждого запро
|
|
641
767
|
request.request_method # "GET"
|
642
768
|
request.query_string # ""
|
643
769
|
request.content_length # длина тела запроса
|
644
|
-
request.media_type #
|
770
|
+
request.media_type # медиатип тела запроса
|
645
771
|
request.host # "example.com"
|
646
|
-
request.get? # true (для других
|
772
|
+
request.get? # true (есть аналоги для других методов HTTP)
|
647
773
|
request.form_data? # false
|
648
|
-
request["SOME_HEADER"] # значение SOME_HEADER
|
774
|
+
request["SOME_HEADER"] # значение заголовка SOME_HEADER
|
649
775
|
request.referer # источник запроса клиента либо '/'
|
650
776
|
request.user_agent # user agent (используется для :agent условия)
|
651
|
-
request.cookies # хеш
|
777
|
+
request.cookies # хеш с куками браузера
|
652
778
|
request.xhr? # является ли запрос ajax запросом?
|
653
779
|
request.url # "http://example.com/example/foo"
|
654
780
|
request.path # "/example/foo"
|
655
|
-
request.ip # IP
|
781
|
+
request.ip # IP-адрес клиента
|
656
782
|
request.secure? # false
|
657
|
-
request.env # env
|
783
|
+
request.env # "сырой" env хеш, полученный Rack
|
658
784
|
end
|
659
785
|
|
660
|
-
Некоторые опции, такие как <tt>script_name</tt> или <tt>path_info</tt>
|
786
|
+
Некоторые опции, такие как <tt>script_name</tt> или <tt>path_info</tt> доступны для записи:
|
661
787
|
|
662
788
|
before { request.path_info = "/" }
|
663
789
|
|
@@ -699,7 +825,7 @@ After-фильтры выполняются после каждого запро
|
|
699
825
|
Обработчики ошибок исполняются в том же контексте, что и маршруты, before-фильтры, а это означает, что всякие
|
700
826
|
прелести вроде <tt>haml</tt>, <tt>erb</tt>, <tt>halt</tt> и т.д. доступны и им.
|
701
827
|
|
702
|
-
===
|
828
|
+
=== NotFound
|
703
829
|
|
704
830
|
Когда возбуждено исключение <tt>Sinatra::NotFound</tt>, или кодом ответа является 404,
|
705
831
|
то будет вызван <tt>not_found</tt> обработчик:
|
@@ -752,9 +878,9 @@ After-фильтры выполняются после каждого запро
|
|
752
878
|
Sinatra устанавливает специальные <tt>not_found</tt> и <tt>error</tt> обработчики, когда запущена в режиме
|
753
879
|
разработки (окружение <tt>:development</tt>).
|
754
880
|
|
755
|
-
== Mime
|
881
|
+
== Mime-типы
|
756
882
|
|
757
|
-
Когда вы используете <tt>send_file</tt> или статические файлы, у вас могут быть mime
|
883
|
+
Когда вы используете <tt>send_file</tt> или статические файлы, у вас могут быть mime-типы, которые Sinatra
|
758
884
|
не понимает по умолчанию. Используйте +mime_type+ для их регистрации по расширению файла:
|
759
885
|
|
760
886
|
mime_type :foo, 'text/foo'
|
@@ -763,15 +889,15 @@ Sinatra устанавливает специальные <tt>not_found</tt> и
|
|
763
889
|
|
764
890
|
content_type :foo
|
765
891
|
|
766
|
-
== Rack
|
892
|
+
== Rack "прослойки"
|
767
893
|
|
768
894
|
Sinatra использует Rack[http://rack.rubyforge.org/], минимальный стандартный
|
769
895
|
интерфейс для веб-фреймворков на Ruby. Одной из самых интересных для разработчиков возможностей Rack
|
770
|
-
является поддержка
|
896
|
+
является поддержка "прослоек" ("middleware") — компонентов,
|
771
897
|
"сидящих" между сервером и вашим приложением, которые отслеживают и/или манипулируют
|
772
898
|
HTTP запросами/ответами для предоставления различной функциональности.
|
773
899
|
|
774
|
-
В Sinatra очень просто использовать такие
|
900
|
+
В Sinatra очень просто использовать такие "прослойки" с помощью метода +use+:
|
775
901
|
|
776
902
|
require 'sinatra'
|
777
903
|
require 'my_custom_middleware'
|
@@ -792,7 +918,7 @@ Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] DSL
|
|
792
918
|
username == 'admin' && password == 'secret'
|
793
919
|
end
|
794
920
|
|
795
|
-
Rack распространяется с различными стандартными
|
921
|
+
Rack распространяется с различными стандартными "прослойками"
|
796
922
|
для логирования, отладки, маршрутизации URL, аутентификации, обработки сессий. Sinatra использует
|
797
923
|
многие из этих компонентов автоматически, основываясь на конфигурации, чтобы вам не приходилось
|
798
924
|
регистрировать/использовать (+use+) их вручную.
|
@@ -829,16 +955,15 @@ Rack распространяется с различными стандартн
|
|
829
955
|
end
|
830
956
|
end
|
831
957
|
|
832
|
-
|
833
|
-
устаревшими, начиная с 0.9.2
|
958
|
+
Обратите внимание: Встроенные модуль Sinatra::Test и класс Sinatra::TestHarness являются
|
959
|
+
устаревшими, начиная с релиза 0.9.2.
|
834
960
|
|
835
|
-
== Sinatra::Base
|
961
|
+
== Sinatra::Base — "прослойки", библиотеки и модульные приложения
|
836
962
|
|
837
963
|
Описание своего приложения самым простейшим способом (с помощью DSL верхнего уровня, как в примерах выше)
|
838
|
-
работает отлично для крохотных приложений, но имеет множество недостатков, когда надо
|
839
|
-
|
840
|
-
|
841
|
-
Sinatra расширения.
|
964
|
+
работает отлично для крохотных приложений, но имеет множество недостатков, когда надо создать компоненты, такие как
|
965
|
+
Rack middleware ("прослойки"), Rails metal, простые библиотеки с серверными компонентами,
|
966
|
+
расширения Sinatra.
|
842
967
|
DSL верхнего уровня загрязняет пространство имен <tt>Object</tt> и подразумевает стиль конфигурации
|
843
968
|
микро-приложения (например, единый файл приложения, ./public и
|
844
969
|
./views директории, создание логов, страницу деталей об исключениях
|
@@ -855,13 +980,6 @@ DSL верхнего уровня загрязняет пространство
|
|
855
980
|
end
|
856
981
|
end
|
857
982
|
|
858
|
-
MyApp класс является независимым Rack компонентом, который может исполнять роли
|
859
|
-
Rack подпрограммы, Rack приложения, Rails metal. Вы можете +use+ (использовать) или
|
860
|
-
+run+ (запустить) этот класс из rackup файла +config.ru+; или контролировать серверную
|
861
|
-
часть из библиотеки:
|
862
|
-
|
863
|
-
MyApp.run! :host => 'localhost', :port => 9090
|
864
|
-
|
865
983
|
Методы, доступные Sinatra::Base сабклассам идентичны тем, что доступны
|
866
984
|
в DSL верхнего уровня. Большинство приложений верхнего уровня могут быть
|
867
985
|
конвертированы в Sinatra::Base компоненты с помощью двух модификаций:
|
@@ -874,10 +992,68 @@ Rack подпрограммы, Rack приложения, Rails metal. Вы мо
|
|
874
992
|
Смотрите {Опции и Конфигурация}[http://www.sinatrarb.com/configuration.html] для детальной информации
|
875
993
|
об опциях и их поведении.
|
876
994
|
|
877
|
-
===
|
995
|
+
=== Запуск модульных приложений
|
996
|
+
|
997
|
+
Есть два общепринятых способа запускать модульные приложения: запуск напрямую с помощью <tt>run!</tt>:
|
998
|
+
|
999
|
+
# my_app.rb
|
1000
|
+
require 'sinatra/base'
|
1001
|
+
|
1002
|
+
class MyApp < Sinatra::Base
|
1003
|
+
# ... здесь код приложения ...
|
1004
|
+
|
1005
|
+
# запускаем сервер, если исполняется текущий файл
|
1006
|
+
run! if app_file == $0
|
1007
|
+
end
|
1008
|
+
|
1009
|
+
И запускаем с помощью:
|
1010
|
+
|
1011
|
+
ruby my_app.rb
|
1012
|
+
|
1013
|
+
Или с помощью конфигурационного файла <tt>config.ru</tt>, который позволяет использовать любой
|
1014
|
+
Rack-совместимый сервер приложений.
|
1015
|
+
|
1016
|
+
# config.ru
|
1017
|
+
require 'my_app'
|
1018
|
+
run MyApp
|
1019
|
+
|
1020
|
+
Запускаем:
|
1021
|
+
|
1022
|
+
rackup -p 4567
|
1023
|
+
|
1024
|
+
=== Запуск "классических" приложений с config.ru
|
1025
|
+
|
1026
|
+
Файл приложения:
|
1027
|
+
|
1028
|
+
# app.rb
|
1029
|
+
require 'sinatra'
|
1030
|
+
|
1031
|
+
get '/' do
|
1032
|
+
'Hello world!'
|
1033
|
+
end
|
1034
|
+
|
1035
|
+
И соответствующий <tt>config.ru</tt>:
|
878
1036
|
|
879
|
-
|
880
|
-
|
1037
|
+
require 'app'
|
1038
|
+
run Sinatra::Application
|
1039
|
+
|
1040
|
+
=== Когда использовать config.ru?
|
1041
|
+
|
1042
|
+
Вот несколько причин, по которым вы, возможно, захотите использовать <tt>config.ru</tt>:
|
1043
|
+
|
1044
|
+
* вы хотите разворачивать свое приложение на различных Rack-совместимых серверах (Passenger, Unicorn,
|
1045
|
+
Heroku, ...).
|
1046
|
+
* вы хотите использовать более одного сабкласса <tt>Sinatra::Base</tt>.
|
1047
|
+
* вы хотите использовать Sinatra только в качестве "прослойки" Rack.
|
1048
|
+
|
1049
|
+
<b>Совсем необязательно переходить на использование <tt>config.ru</tt> лишь потому, что вы стали
|
1050
|
+
использовать модульный стиль приложения. И необязательно использовать модульный стиль, чтобы
|
1051
|
+
запускать приложение с помощью <tt>config.ru</tt>.</b>
|
1052
|
+
|
1053
|
+
=== Использование Sinatra в качестве "прослойки"
|
1054
|
+
|
1055
|
+
Не только сама Sinatra может использовать "прослойки" Rack, но и любое Sinatra приложение
|
1056
|
+
само может быть добавлено к любому Rack эндпоинту в качестве "прослойки". Этим эндпоинтом
|
881
1057
|
может быть другое Sinatra приложение, или приложение, основанное на Rack (Rails/Ramaze/Camping/...).
|
882
1058
|
|
883
1059
|
require 'sinatra/base'
|
@@ -897,7 +1073,7 @@ Rack подпрограммы, Rack приложения, Rails metal. Вы мо
|
|
897
1073
|
end
|
898
1074
|
|
899
1075
|
class MyApp < Sinatra::Base
|
900
|
-
#
|
1076
|
+
# "прослойка" будет запущена перед фильтрами
|
901
1077
|
use LoginScreen
|
902
1078
|
|
903
1079
|
before do
|
@@ -1014,31 +1190,69 @@ Sinatra приложения могут быть запущены напряму
|
|
1014
1190
|
|
1015
1191
|
== На острие
|
1016
1192
|
|
1017
|
-
Если вы хотите использовать
|
1018
|
-
|
1019
|
-
|
1193
|
+
Если вы хотите использовать самый последний код Sinatra, не бойтесь запускать
|
1194
|
+
свое приложение вместе с master бранчем Sinatra, он весьма стабилен.
|
1195
|
+
|
1196
|
+
Мы также время от времени выпускаем предварительные версии, так что вы можете делать так:
|
1197
|
+
|
1198
|
+
gem install sinatra --pre
|
1199
|
+
|
1200
|
+
Чтобы воспользоваться некоторыми самыми последними возможностям.
|
1201
|
+
|
1202
|
+
=== С помощью Bundler
|
1203
|
+
|
1204
|
+
Если вы хотите запускать свое приложение с последней версией Sinatra, то
|
1205
|
+
рекомендуем использовать {Bundler}[http://gembundler.com/].
|
1206
|
+
|
1207
|
+
Сначала установите Bundler, если у вас его еще нет:
|
1208
|
+
|
1209
|
+
gem install bundler
|
1210
|
+
|
1211
|
+
Затем создайте файл +Gemfile+ в директории вашего проекта:
|
1212
|
+
|
1213
|
+
source :rubygems
|
1214
|
+
gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
|
1215
|
+
|
1216
|
+
# другие зависимости
|
1217
|
+
gem 'haml' # например, если используете haml
|
1218
|
+
gem 'activerecord', '~> 3.0' # может быть, вам нужен и ActiveRecord 3.x
|
1219
|
+
|
1220
|
+
Обратите внимание, вам нужно будет указывать все зависимости вашего приложения
|
1221
|
+
в этом файле. Однако, непосредственные зависимости Sinatra (Rack и Tilt) Bundler
|
1222
|
+
автоматически скачает и добавит.
|
1223
|
+
|
1224
|
+
Теперь вы можете запускать свое приложение примерно так:
|
1225
|
+
|
1226
|
+
bundle exec ruby myapp.rb
|
1227
|
+
|
1228
|
+
=== Вручную
|
1229
|
+
|
1230
|
+
Создайте локальный клон репозитория и запускайте свое приложение с <tt>sinatra/lib</tt>
|
1231
|
+
директорией в <tt>LOAD_PATH</tt>:
|
1020
1232
|
|
1021
1233
|
cd myapp
|
1022
1234
|
git clone git://github.com/sinatra/sinatra.git
|
1023
1235
|
ruby -Isinatra/lib myapp.rb
|
1024
1236
|
|
1025
|
-
|
1026
|
-
<tt>LOAD_PATH</tt> приложения:
|
1237
|
+
Чтобы обновить исходники Sinatra:
|
1027
1238
|
|
1028
|
-
|
1029
|
-
|
1030
|
-
require 'sinatra'
|
1239
|
+
cd myapp/sinatra
|
1240
|
+
git pull
|
1031
1241
|
|
1032
|
-
|
1033
|
-
"I'm running version " + Sinatra::VERSION
|
1034
|
-
end
|
1242
|
+
=== Установка глобально
|
1035
1243
|
|
1036
|
-
|
1244
|
+
Вы можете самостоятельно собрать gem:
|
1037
1245
|
|
1038
|
-
|
1039
|
-
|
1246
|
+
git clone git://github.com/sinatra/sinatra.git
|
1247
|
+
cd sinatra
|
1248
|
+
rake sinatra.gemspec
|
1249
|
+
rake install
|
1250
|
+
|
1251
|
+
Если вы устанавливаете пакеты (gem) от пользователя root, то вашим последним шагом должна быть команда
|
1252
|
+
|
1253
|
+
sudo rake install
|
1040
1254
|
|
1041
|
-
==
|
1255
|
+
== Дальнейшее чтение
|
1042
1256
|
|
1043
1257
|
* {Вебсайт проекта}[http://www.sinatrarb.com/] - Дополнительная документация,
|
1044
1258
|
новости и ссылки на другие ресурсы.
|