sinatra 2.0.0 → 2.0.1.rc1

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Sinatra
2
2
 
3
- [![Build Status](https://secure.travis-ci.org/sinatra/sinatra.svg)](http://travis-ci.org/sinatra/sinatra)
3
+ [![Build Status](https://secure.travis-ci.org/sinatra/sinatra.svg)](https://travis-ci.org/sinatra/sinatra)
4
4
 
5
5
  Sinatra is a [DSL](https://en.wikipedia.org/wiki/Domain-specific_language) for
6
6
  quickly creating web applications in Ruby with minimal effort:
@@ -28,6 +28,10 @@ ruby myapp.rb
28
28
 
29
29
  View at: [http://localhost:4567](http://localhost:4567)
30
30
 
31
+ The code you changed will not take effect until you restart the server.
32
+ Please restart the server every time you change or use
33
+ [sinatra/reloader](http://www.sinatrarb.com/contrib/reloader).
34
+
31
35
  It is recommended to also run `gem install thin`, which Sinatra will
32
36
  pick up if available.
33
37
 
@@ -75,9 +79,9 @@ pick up if available.
75
79
  * [Filters](#filters)
76
80
  * [Helpers](#helpers)
77
81
  * [Using Sessions](#using-sessions)
78
- * [Session Secret Security](#session-secret-security)
79
- * [Session Config](#session-config)
80
- * [Choosing Your Own Session Middleware](#choosing-your-own-session-middleware)
82
+ * [Session Secret Security](#session-secret-security)
83
+ * [Session Config](#session-config)
84
+ * [Choosing Your Own Session Middleware](#choosing-your-own-session-middleware)
81
85
  * [Halting](#halting)
82
86
  * [Passing](#passing)
83
87
  * [Triggering Another Route](#triggering-another-route)
@@ -253,11 +257,11 @@ end
253
257
  ```
254
258
 
255
259
  By the way, unless you disable the path traversal attack protection (see
256
- below), the request path might be modified before matching against your
257
- routes.
260
+ [below](#configuring-attack-protection)), the request path might be modified before
261
+ matching against your routes.
258
262
 
259
- You may customize the Mustermann options used for a given route by passing in a
260
- `:mustermann_opts` hash:
263
+ You may customize the [Mustermann](https://github.com/sinatra/mustermann#readme)
264
+ options used for a given route by passing in a `:mustermann_opts` hash:
261
265
 
262
266
  ```ruby
263
267
  get '\A/posts\z', :mustermann_opts => { :type => :regexp, :check_anchors => false } do
@@ -365,7 +369,7 @@ end
365
369
  get('/') { Stream.new }
366
370
  ```
367
371
 
368
- You can also use the `stream` helper method (described below) to reduce
372
+ You can also use the `stream` helper method ([described below](#streaming-responses)) to reduce
369
373
  boiler plate and embed the streaming logic in the route.
370
374
 
371
375
  ## Custom Route Matchers
@@ -428,7 +432,7 @@ Note that the public directory name is not included in the URL. A file
428
432
  `./public/css/style.css` is made available as
429
433
  `http://example.com/css/style.css`.
430
434
 
431
- Use the `:static_cache_control` setting (see below) to add
435
+ Use the `:static_cache_control` setting (see [below](#cache-control)) to add
432
436
  `Cache-Control` header info.
433
437
 
434
438
  ## Views / Templates
@@ -638,7 +642,7 @@ get('/') { markdown :index }
638
642
  </tr>
639
643
  </table>
640
644
 
641
- It also takes a block for inline templates (see example).
645
+ It also takes a block for inline templates (see [example](#inline-templates)).
642
646
 
643
647
  #### Nokogiri Templates
644
648
 
@@ -657,14 +661,14 @@ It also takes a block for inline templates (see example).
657
661
  </tr>
658
662
  </table>
659
663
 
660
- It also takes a block for inline templates (see example).
664
+ It also takes a block for inline templates (see [example](#inline-templates)).
661
665
 
662
666
  #### Sass Templates
663
667
 
664
668
  <table>
665
669
  <tr>
666
670
  <td>Dependency</td>
667
- <td><a href="http://sass-lang.com/" title="sass">sass</a></td>
671
+ <td><a href="https://sass-lang.com/" title="sass">sass</a></td>
668
672
  </tr>
669
673
  <tr>
670
674
  <td>File Extension</td>
@@ -681,7 +685,7 @@ It also takes a block for inline templates (see example).
681
685
  <table>
682
686
  <tr>
683
687
  <td>Dependency</td>
684
- <td><a href="http://sass-lang.com/" title="sass">sass</a></td>
688
+ <td><a href="https://sass-lang.com/" title="sass">sass</a></td>
685
689
  </tr>
686
690
  <tr>
687
691
  <td>File Extension</td>
@@ -739,8 +743,8 @@ template, you almost always want to pass locals to it.
739
743
  Anyone of:
740
744
  <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
741
745
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
742
- <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
743
- <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
746
+ <a href="https://github.com/ged/bluecloth" title="BlueCloth">BlueCloth</a>,
747
+ <a href="https://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
744
748
  <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
745
749
  </td>
746
750
  </tr>
@@ -890,7 +894,7 @@ almost always want to pass locals to it.
890
894
  <table>
891
895
  <tr>
892
896
  <td>Dependency</td>
893
- <td><a href="http://markaby.github.io/" title="Markaby">Markaby</a></td>
897
+ <td><a href="https://markaby.github.io/" title="Markaby">Markaby</a></td>
894
898
  </tr>
895
899
  <tr>
896
900
  <td>File Extension</td>
@@ -902,7 +906,7 @@ almost always want to pass locals to it.
902
906
  </tr>
903
907
  </table>
904
908
 
905
- It also takes a block for inline templates (see example).
909
+ It also takes a block for inline templates (see [example](#inline-templates)).
906
910
 
907
911
  #### RABL Templates
908
912
 
@@ -1019,7 +1023,7 @@ template than for the layout by passing the `:layout_engine` option.
1019
1023
  <a href="https://github.com/josh/ruby-coffee-script" title="Ruby CoffeeScript">
1020
1024
  CoffeeScript
1021
1025
  </a> and a
1022
- <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
1026
+ <a href="https://github.com/sstephenson/execjs" title="ExecJS">
1023
1027
  way to execute javascript
1024
1028
  </a>
1025
1029
  </td>
@@ -1043,7 +1047,7 @@ template than for the layout by passing the `:layout_engine` option.
1043
1047
  <a href="https://github.com/forgecrafted/ruby-stylus" title="Ruby Stylus">
1044
1048
  Stylus
1045
1049
  </a> and a
1046
- <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
1050
+ <a href="https://github.com/sstephenson/execjs" title="ExecJS">
1047
1051
  way to execute javascript
1048
1052
  </a>
1049
1053
  </td>
@@ -1117,7 +1121,7 @@ present(resource);
1117
1121
  <table>
1118
1122
  <tr>
1119
1123
  <td>Dependency</td>
1120
- <td><a href="https://github.com/blambeau/wlang/" title="WLang">WLang</a></td>
1124
+ <td><a href="https://github.com/blambeau/wlang" title="WLang">WLang</a></td>
1121
1125
  </tr>
1122
1126
  <tr>
1123
1127
  <td>File Extension</td>
@@ -1273,8 +1277,8 @@ get '/' do
1273
1277
  end
1274
1278
  ```
1275
1279
 
1276
- Renders `./views/index.myat`. See https://github.com/rtomayko/tilt to
1277
- learn more about Tilt.
1280
+ Renders `./views/index.myat`. Learn more about
1281
+ [Tilt](https://github.com/rtomayko/tilt#readme).
1278
1282
 
1279
1283
  ### Using Custom Logic for Template Lookup
1280
1284
 
@@ -1435,8 +1439,8 @@ $ ruby -e "require 'securerandom'; puts SecureRandom.hex(64)"
1435
1439
 
1436
1440
  **Session Secret Generation (Bonus Points)**
1437
1441
 
1438
- Use the [sysrandom gem](https://github.com/cryptosphere/sysrandom) to prefer
1439
- use of system RNG facilities to generate random values instead of
1442
+ Use the [sysrandom gem](https://github.com/cryptosphere/sysrandom#readme) to
1443
+ prefer use of system RNG facilities to generate random values instead of
1440
1444
  userspace `OpenSSL` which MRI Ruby currently defaults to:
1441
1445
 
1442
1446
  ```text
@@ -1466,7 +1470,7 @@ Setup your app config to fail-safe to a secure random secret
1466
1470
  if the `SESSION_SECRET` environment variable is not available.
1467
1471
 
1468
1472
  For bonus points use the [sysrandom
1469
- gem](https://github.com/cryptosphere/sysrandom) here as well:
1473
+ gem](https://github.com/cryptosphere/sysrandom#readme) here as well:
1470
1474
 
1471
1475
  ```ruby
1472
1476
  require 'securerandom'
@@ -1523,7 +1527,7 @@ use Rack::Protection::RemoteToken
1523
1527
  use Rack::Protection::SessionHijacking
1524
1528
  ```
1525
1529
 
1526
- See 'Configuring attack protection' for more information.
1530
+ See '[Configuring attack protection](#configuring-attack-protection)' for more information.
1527
1531
 
1528
1532
  ### Halting
1529
1533
 
@@ -1625,7 +1629,7 @@ end
1625
1629
  ```
1626
1630
 
1627
1631
  It is also possible to pass a block to `body`, which will be executed by the
1628
- Rack handler (this can be used to implement streaming, see "Return Values").
1632
+ Rack handler (this can be used to implement streaming, [see "Return Values"](#return-values)).
1629
1633
 
1630
1634
  Similar to the body, you can also set the status code and headers:
1631
1635
 
@@ -1634,7 +1638,7 @@ get '/foo' do
1634
1638
  status 418
1635
1639
  headers \
1636
1640
  "Allow" => "BREW, POST, GET, PROPFIND, WHEN",
1637
- "Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
1641
+ "Refresh" => "Refresh: 20; https://ietf.org/rfc/rfc2324.txt"
1638
1642
  body "I'm a tea pot!"
1639
1643
  end
1640
1644
  ```
@@ -1773,7 +1777,7 @@ Haml:
1773
1777
 
1774
1778
  It takes reverse proxies and Rack routers into account, if present.
1775
1779
 
1776
- This method is also aliased to `to` (see below for an example).
1780
+ This method is also aliased to `to` (see [below](#browser-redirect) for an example).
1777
1781
 
1778
1782
  ### Browser Redirect
1779
1783
 
@@ -1881,7 +1885,7 @@ etag @article.sha1, :weak
1881
1885
  These helpers will not do any caching for you, but rather feed the necessary
1882
1886
  information to your cache. If you are looking for a quick
1883
1887
  reverse-proxy caching solution, try
1884
- [rack-cache](https://github.com/rtomayko/rack-cache):
1888
+ [rack-cache](https://github.com/rtomayko/rack-cache#readme):
1885
1889
 
1886
1890
  ```ruby
1887
1891
  require "rack/cache"
@@ -1896,7 +1900,7 @@ get '/' do
1896
1900
  end
1897
1901
  ```
1898
1902
 
1899
- Use the `:static_cache_control` setting (see below) to add
1903
+ Use the `:static_cache_control` setting (see [below](#cache-control)) to add
1900
1904
  `Cache-Control` header info to static files.
1901
1905
 
1902
1906
  According to RFC 2616, your application should behave differently if the
@@ -2208,7 +2212,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2208
2212
  ```
2209
2213
 
2210
2214
  By default, Sinatra will only set up session based protection if `:sessions`
2211
- have been enabled. See 'Using Sessions'. Sometimes you may want to set up
2215
+ have been enabled. See '[Using Sessions](#using-sessions)'. Sometimes you may want to set up
2212
2216
  sessions "outside" of the Sinatra app, such as in the config.ru or with a
2213
2217
  separate `Rack::Builder` instance. In that case you can still set up session
2214
2218
  based protection by passing the `:session` option:
@@ -2353,6 +2357,16 @@ set :protection, :session => true
2353
2357
  priority, default depends on Ruby implementation.
2354
2358
  </dd>
2355
2359
 
2360
+ <dt>server_settings</dt>
2361
+ <dd>
2362
+ If you are using a WEBrick web server, presumably for your development
2363
+ environment, you can pass a hash of options to <tt>server_settings</tt>,
2364
+ such as <tt>SSLEnable</tt> or <tt>SSLVerifyClient</tt>. However, web
2365
+ servers such as Puma and Thin do not support this, so you can set
2366
+ <tt>server_settings</tt> by defining it as a method when you call
2367
+ <tt>configure</tt>.
2368
+ </dd>
2369
+
2356
2370
  <dt>sessions</dt>
2357
2371
  <dd>
2358
2372
  Enable cookie-based sessions support using
@@ -2531,7 +2545,7 @@ and additional debugging information in your browser.
2531
2545
 
2532
2546
  ## Rack Middleware
2533
2547
 
2534
- Sinatra rides on [Rack](http://rack.github.io/), a minimal standard
2548
+ Sinatra rides on [Rack](https://rack.github.io/), a minimal standard
2535
2549
  interface for Ruby web frameworks. One of Rack's most interesting
2536
2550
  capabilities for application developers is support for "middleware" --
2537
2551
  components that sit between the server and your application monitoring
@@ -2571,7 +2585,7 @@ typically don't have to `use` them explicitly.
2571
2585
 
2572
2586
  You can find useful middleware in
2573
2587
  [rack](https://github.com/rack/rack/tree/master/lib/rack),
2574
- [rack-contrib](https://github.com/rack/rack-contrib#readm),
2588
+ [rack-contrib](https://github.com/rack/rack-contrib#readme),
2575
2589
  or in the [Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware).
2576
2590
 
2577
2591
  ## Testing
@@ -2995,7 +3009,9 @@ Options are:
2995
3009
 
2996
3010
  ### Multi-threading
2997
3011
 
2998
- _Paraphrasing from [this StackOverflow answer][so-answer] by Konstantin_
3012
+ _Paraphrasing from
3013
+ [this StackOverflow answer](https://stackoverflow.com/a/6282999/5245129)
3014
+ by Konstantin_
2999
3015
 
3000
3016
  Sinatra doesn't impose any concurrency model, but leaves that to the
3001
3017
  underlying Rack handler (server) like Thin, Puma or WEBrick. Sinatra
@@ -3026,9 +3042,6 @@ To start the server, the command would be:
3026
3042
  thin --threaded start
3027
3043
  ```
3028
3044
 
3029
-
3030
- [so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
3031
-
3032
3045
  ## Requirement
3033
3046
 
3034
3047
  The following Ruby versions are officially supported:
@@ -3097,7 +3110,7 @@ to get some of the latest features.
3097
3110
  ### With Bundler
3098
3111
 
3099
3112
  If you want to run your application with the latest Sinatra, using
3100
- [Bundler](http://bundler.io) is the recommended way.
3113
+ [Bundler](https://bundler.io) is the recommended way.
3101
3114
 
3102
3115
  First, install bundler, if you haven't:
3103
3116
 
@@ -3127,7 +3140,7 @@ bundle exec ruby myapp.rb
3127
3140
 
3128
3141
  ## Versioning
3129
3142
 
3130
- Sinatra follows [Semantic Versioning](http://semver.org/), both SemVer and
3143
+ Sinatra follows [Semantic Versioning](https://semver.org/), both SemVer and
3131
3144
  SemVerTag.
3132
3145
 
3133
3146
  ## Further Reading
@@ -3138,14 +3151,14 @@ SemVerTag.
3138
3151
  help? Have a patch?
3139
3152
  * [Issue tracker](https://github.com/sinatra/sinatra/issues)
3140
3153
  * [Twitter](https://twitter.com/sinatra)
3141
- * [Mailing List](http://groups.google.com/group/sinatrarb/topics)
3142
- * IRC: [#sinatra](irc://chat.freenode.net/#sinatra) on http://freenode.net
3143
- * [Sinatra & Friends](https://sinatrarb.slack.com) on Slack and see
3144
- [here](https://sinatra-slack.herokuapp.com/) for an invite.
3145
- * [Sinatra Book](https://github.com/sinatra/sinatra-book/) Cookbook Tutorial
3146
- * [Sinatra Recipes](http://recipes.sinatrarb.com/) Community
3147
- contributed recipes
3154
+ * [Mailing List](https://groups.google.com/forum/#!forum/sinatrarb)
3155
+ * IRC: [#sinatra](irc://chat.freenode.net/#sinatra) on [Freenode](https://freenode.net)
3156
+ * [Sinatra & Friends](https://sinatrarb.slack.com) on Slack
3157
+ ([get an invite](https://sinatra-slack.herokuapp.com/))
3158
+ * [Sinatra Book](https://github.com/sinatra/sinatra-book) - Cookbook Tutorial
3159
+ * [Sinatra Recipes](http://recipes.sinatrarb.com/) - Community contributed
3160
+ recipes
3148
3161
  * API documentation for the [latest release](http://www.rubydoc.info/gems/sinatra)
3149
3162
  or the [current HEAD](http://www.rubydoc.info/github/sinatra/sinatra) on
3150
- http://www.rubydoc.info/
3163
+ [RubyDoc](http://www.rubydoc.info/)
3151
3164
  * [CI server](https://travis-ci.org/sinatra/sinatra)
@@ -1,12 +1,49 @@
1
1
  # Sinatra
2
2
 
3
+ [![Build Status](https://secure.travis-ci.org/sinatra/sinatra.svg)](http://travis-ci.org/sinatra/sinatra)
4
+
5
+ *Внимание: Этот документ является переводом английской версии и может быть
6
+ устаревшим*
7
+
8
+ Sinatra — это предметно-ориентированный каркас
9
+ ([DSL](https://ru.wikipedia.org/wiki/Предметно-ориентированный_язык))
10
+ для быстрого создания функциональных веб-приложений на Ruby с минимумом усилий:
11
+
12
+ ```ruby
13
+ # myapp.rb
14
+ require 'sinatra'
15
+
16
+ get '/' do
17
+ 'Hello world!'
18
+ end
19
+ ```
20
+
21
+ Установите gem:
22
+
23
+ ```shell
24
+ gem install sinatra
25
+ ```
26
+
27
+ и запустите приложение с помощью:
28
+
29
+ ```shell
30
+ ruby myapp.rb
31
+ ```
32
+
33
+ Оцените результат: [http://localhost:4567](http://localhost:4567)
34
+
35
+ Рекомендуется также установить Thin, сделать это можно командой: `gem install
36
+ thin`. Thin — это более производительный и функциональный сервер для
37
+ разработки приложений на Sinatra.
38
+
3
39
  ## Содержание
4
40
 
5
41
  * [Sinatra](#sinatra)
42
+ * [Содержание](#Содержание)
6
43
  * [Маршруты](#Маршруты)
7
- * [Условия](#Условия)
8
- * [Возвращаемые значения](#Возвращаемые-значения)
9
- * [Собственные детекторы совпадений для маршрутов](#Собственные-детекторы-совпадений-для-маршрутов)
44
+ * [Условия](#Условия)
45
+ * [Возвращаемые значения](#Возвращаемые-значения)
46
+ * [Собственные детекторы совпадений для маршрутов](#Собственные-детекторы-совпадений-для-маршрутов)
10
47
  * [Статические файлы](#Статические-файлы)
11
48
  * [Представления / Шаблоны](#Представления--Шаблоны)
12
49
  * [Буквальные шаблоны](#Буквальные-шаблоны)
@@ -39,14 +76,17 @@
39
76
  * [Именованные шаблоны](#Именованные-шаблоны)
40
77
  * [Привязка файловых расширений](#Привязка-файловых-расширений)
41
78
  * [Добавление собственного движка рендеринга](#Добавление-собственного-движка-рендеринга)
79
+ * [Использование пользовательской логики для поиска шаблона](#Использование-пользовательской-логики-для-поиска-шаблона)
42
80
  * [Фильтры](#Фильтры)
43
81
  * [Методы-помощники](#Методы-помощники)
44
82
  * [Использование сессий](#Использование-сессий)
83
+ * [Секретная безопасность сессии](#Секретная-безопасность-сессии)
84
+ * [Конфигурация сессии](#Конфигурация-сессии)
45
85
  * [Выбор вашей собственной "прослойки" сессии](#Выбор-вашей-собственной-прослойки-сессий)
46
86
  * [Прерывание](#Прерывание)
47
87
  * [Передача](#Передача)
48
88
  * [Вызов другого маршрута](#Вызов-другого-маршрута)
49
- * [Задание тела, кода и заголовков ответа](#Задание-тела-кода-и-заголовков-ответа)
89
+ * [Задание тела, статус кода и заголовков ответа](#Задание-тела-статуса-кода-и-заголовков-ответа)
50
90
  * [Стриминг ответов](#Стриминг-ответов)
51
91
  * [Логирование](#Логирование)
52
92
  * [Mime-типы](#mime-типы)
@@ -79,47 +119,13 @@
79
119
  * [Область видимости запроса / экземпляра](#Область-видимости-запроса--экземпляра)
80
120
  * [Область видимости делегирования](#Область-видимости-делегирования)
81
121
  * [Командная строка](#Командная-строка)
82
- * [Multi-threading](#multi-threading)
122
+ * [Многопоточность](#Многопоточность)
83
123
  * [Системные требования](#Системные-требования)
84
124
  * [На острие](#На-острие)
85
125
  * [С помощью Bundler](#С-помощью-bundler)
86
126
  * [Версии](#Версии)
87
127
  * [Дальнейшее чтение](#Дальнейшее-чтение)
88
128
 
89
- *Внимание: Этот документ является переводом английской версии и может быть
90
- устаревшим*
91
-
92
- Sinatra — это предметно-ориентированный каркас
93
- ([DSL](https://ru.wikipedia.org/wiki/Предметно-ориентированный_язык))
94
- для быстрого создания функциональных веб-приложений на Ruby с минимумом усилий:
95
-
96
- ```ruby
97
- # myapp.rb
98
- require 'sinatra'
99
-
100
- get '/' do
101
- 'Hello world!'
102
- end
103
- ```
104
-
105
- Установите gem:
106
-
107
- ```shell
108
- gem install sinatra
109
- ```
110
-
111
- и запустите приложение с помощью:
112
-
113
- ```shell
114
- ruby myapp.rb
115
- ```
116
-
117
- Оцените результат: [http://localhost:4567](http://localhost:4567)
118
-
119
- Рекомендуется также установить Thin, сделать это можно командой: `gem install
120
- thin`. Thin — это более производительный и функциональный сервер для
121
- разработки приложений на Sinatra.
122
-
123
129
  ## Маршруты
124
130
 
125
131
  В Sinatra маршрут — это пара: &lt;HTTP метод&gt; и &lt;шаблон URL&gt;. Каждый маршрут
@@ -151,32 +157,43 @@ options '/' do
151
157
  end
152
158
 
153
159
  link '/' do
154
- .. что-то подключить ..
160
+ # .. что-то подключить ..
155
161
  end
156
162
 
157
163
  unlink '/' do
158
- .. что-то отключить ..
164
+ # .. что-то отключить ..
159
165
  end
160
166
  ```
161
167
 
162
168
  Маршруты сверяются с запросом в порядке очередности их записи в файле
163
169
  приложения. Первый же совпавший с запросом маршрут и будет вызван.
164
170
 
171
+ Маршруты с конечным слэшем отличаются от маршрутов без него:
172
+
173
+ ```ruby
174
+ get '/foo' do
175
+ # не соответствует "GET /foo/"
176
+ end
177
+ ```
178
+
165
179
  Шаблоны маршрутов могут включать в себя именованные параметры, доступные в xэше
166
180
  `params`:
167
181
 
168
182
  ```ruby
169
183
  get '/hello/:name' do
170
184
  # соответствует "GET /hello/foo" и "GET /hello/bar",
171
- # где params['name'] 'foo' или 'bar'
185
+ # где params['name'] - это 'foo' или 'bar'
172
186
  "Hello #{params['name']}!"
173
187
  end
174
188
  ```
175
189
 
176
- Также можно использовать именованные параметры в качестве переменных блока:
190
+ Также можно получить доступ к именованным параметрам через параметры блока:
177
191
 
178
192
  ```ruby
179
193
  get '/hello/:name' do |n|
194
+ # соответствует "GET /hello/foo" и "GET /hello/bar",
195
+ # где params['name'] - это 'foo' или 'bar'
196
+ # n хранит params['name']
180
197
  "Hello #{n}!"
181
198
  end
182
199
  ```
@@ -215,7 +232,7 @@ end
215
232
  Или с параметром блока:
216
233
 
217
234
  ```ruby
218
- # Находит "GET /meta/hello/world", "GET /hello/world/1234" и так далее
235
+ # Соответствует "GET /meta/hello/world", "GET /hello/world/1234" и т.д.
219
236
  get %r{/hello/([\w]+)} do |c|
220
237
  "Hello, #{c}!"
221
238
  end
@@ -229,10 +246,33 @@ get '/posts/:format?' do
229
246
  end
230
247
  ```
231
248
 
249
+ Маршруты также могут использовать параметры запроса:
250
+
251
+ ```ruby
252
+ get '/posts' do
253
+ # соответствует "GET /posts?title=foo&author=bar"
254
+ title = params['title']
255
+ author = params['author']
256
+ # используются переменные title и author; запрос не обязателен для маршрута /posts
257
+ end
258
+ ```
259
+
232
260
  Кстати, если вы не отключите защиту от обратного пути в директориях (path
233
261
  traversal, см. ниже), путь запроса может быть изменен до начала поиска
234
262
  подходящего маршрута.
235
263
 
264
+ Вы можете настроить Mustermann опции, используемые для данного маршрута, путём передачи в `:mustermann_opts` хэш:
265
+
266
+ ```ruby
267
+ get '\A/posts\z', :mustermann_opts => { :type => :regexp, :check_anchors => false } do
268
+ # в точности соответствует /posts, с явной привязкой
269
+ "If you match an anchored pattern clap your hands!"
270
+ end
271
+ ```
272
+
273
+ Это похоже на [условие](#Условия), но это не так! Эти опции будут объеденины в глобальный `:mustermann_opts` хэш, описанный
274
+ [ниже](#Доступные-настройки).
275
+
236
276
  ### Условия
237
277
 
238
278
  Маршруты могут включать различные условия совпадений, например, клиентское
@@ -263,6 +303,7 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
263
303
  builder :feed
264
304
  end
265
305
  ```
306
+ `provides` ищет заголовок запроса `Accept`.
266
307
 
267
308
  Вы можете задать собственные условия:
268
309
 
@@ -306,7 +347,7 @@ end
306
347
  другие значения.
307
348
 
308
349
  Вы можете вернуть любой объект, который будет либо корректным Rack ответом,
309
- объектом Rack body, либо кодом состояния HTTP:
350
+ либо объектом Rack body, либо кодом состояния HTTP:
310
351
 
311
352
  * массив с тремя переменными: `[код (Fixnum), заголовки (Hash), тело ответа
312
353
  (должно отвечать на #each)]`;
@@ -330,8 +371,8 @@ get('/') { Stream.new }
330
371
  ```
331
372
 
332
373
  Вы также можете использовать метод `stream` (описываемый ниже), чтобы
333
- уменьшить количество дублируемого кода и держать логику стриминга прямо в
334
- маршруте.
374
+ уменьшить количество шаблонного кода и встраивать поточную логику прямо в
375
+ маршрут.
335
376
 
336
377
  ### Собственные детекторы совпадений для маршрутов
337
378
 
@@ -497,6 +538,12 @@ end
497
538
  лэйаутов. По умолчанию: тот же шаблонизатор, что используется и для самого
498
539
  шаблона. Пример: <tt>set :rdoc, :layout_engine => :erb</tt>
499
540
  </dd>
541
+
542
+ <dt>layout_options</dt>
543
+ <dd>
544
+ Специальные опции, используемые только для рендеринга лэйаута. Например:
545
+ <tt>set :rdoc, :layout_options => { :views => 'views/layouts' }</tt>
546
+ </dd>
500
547
  </dl>
501
548
 
502
549
  По умолчанию считается, что шаблоны находятся в директории `./views`. Чтобы
@@ -519,7 +566,15 @@ get '/' do
519
566
  end
520
567
  ```
521
568
 
522
- Отобразит шаблон, переданный строкой.
569
+ Отобразит шаблон, переданный строкой. Опционально, можно задать `:path` и
570
+ `:line` для более понятного бэктрейса, в случае, если существует путь к
571
+ файловой системе и линия, которые ассоциируются с этой строкой:
572
+
573
+ ```ruby
574
+ get '/' do
575
+ haml '%div.title Hello World', :path => 'examples/file.haml', :line => 3
576
+ end
577
+ ```
523
578
 
524
579
  ### Доступные шаблонизаторы
525
580
 
@@ -1117,9 +1172,9 @@ end
1117
1172
  как описано выше, либо он может быть дополнен блоком:
1118
1173
 
1119
1174
  ```ruby
1120
- erb :post, :layout => false do
1121
- erb :index
1122
- end
1175
+ erb :post, :layout => false do
1176
+ erb :index
1177
+ end
1123
1178
  ```
1124
1179
 
1125
1180
  Эти инструкции в основном эквивалентны `erb :index, :layout => :post`.
@@ -1128,19 +1183,19 @@ end
1128
1183
  создания вложенных раскладок:
1129
1184
 
1130
1185
  ```ruby
1131
- erb :main_layout, :layout => false do
1132
- erb :admin_layout do
1133
- erb :user
1134
- end
1135
- end
1186
+ erb :main_layout, :layout => false do
1187
+ erb :admin_layout do
1188
+ erb :user
1189
+ end
1190
+ end
1136
1191
  ```
1137
1192
 
1138
1193
  Это же самое может быть сделано короче:
1139
1194
 
1140
1195
  ```ruby
1141
- erb :admin_layout, :layout => :main_layout do
1142
- erb :user
1143
- end
1196
+ erb :admin_layout, :layout => :main_layout do
1197
+ erb :user
1198
+ end
1144
1199
  ```
1145
1200
 
1146
1201
  В настоящее время, следующие интерпретирующие шаблоны методы
@@ -1232,6 +1287,23 @@ end
1232
1287
  Отобразит `./views/index.myat`. Чтобы узнать больше о Tilt, смотрите
1233
1288
  https://github.com/rtomayko/tilt
1234
1289
 
1290
+ ### Использование пользовательской логики для поиска шаблона
1291
+
1292
+ Для того, чтобы реализовать свой собственный механизм поиска шаблона,
1293
+ необходимо написать свой собственный `#find_template` метод:
1294
+
1295
+ ```ruby
1296
+ configure do
1297
+ set :views [ './views/a', './views/b' ]
1298
+ end
1299
+
1300
+ def find_template(views, name, engine, &block)
1301
+ Array(views).each do |v|
1302
+ super(v, name, engine, &block)
1303
+ end
1304
+ end
1305
+ ```
1306
+
1235
1307
  ## Фильтры
1236
1308
 
1237
1309
  `before`-фильтры выполняются перед каждым запросом в том же контексте, что и
@@ -1274,7 +1346,7 @@ before '/protected/*' do
1274
1346
  end
1275
1347
 
1276
1348
  after '/create/:slug' do |slug|
1277
- session['last_slug'] = slug
1349
+ session[:last_slug] = slug
1278
1350
  end
1279
1351
  ```
1280
1352
 
@@ -1292,8 +1364,8 @@ end
1292
1364
 
1293
1365
  ## Методы-помощники
1294
1366
 
1295
- Используйте метод `helpers`, чтобы определить методы-помощники, которые в
1296
- дальнейшем можно будет использовать в обработчиках маршрутов и шаблонах:
1367
+ Используйте высокоуровневый метод `helpers`, чтобы определить
1368
+ методы-помощники для использования в обработчиках маршрутов и шаблонах:
1297
1369
 
1298
1370
  ```ruby
1299
1371
  helpers do
@@ -1332,7 +1404,7 @@ helpers FooUtils, BarUtils
1332
1404
  enable :sessions
1333
1405
 
1334
1406
  get '/' do
1335
- "value = " << session['value'].inspect
1407
+ "value = " << session[:value].inspect
1336
1408
  end
1337
1409
 
1338
1410
  get '/:value' do
@@ -1340,16 +1412,83 @@ get '/:value' do
1340
1412
  end
1341
1413
  ```
1342
1414
 
1343
- Для повышения безопасности данные сессии в куках подписываются секретным
1344
- ключом. Секретный ключ генерируется Sinatra. Тем не менее, так как этот ключ
1345
- будет меняться с каждым запуском приложения, вы, возможно, захотите установить
1346
- ключ вручную, чтобы у всех экземпляров вашего приложения был один и тот же
1347
- ключ:
1415
+ ### Секретная безопасность сессии
1416
+
1417
+ Чтобы повысить безопасность, данные сессии в файле 'cookie' подписываются
1418
+ ключом сессии с использованием `HMAC-SHA1`. Этот ключ сессии должен быть
1419
+ оптимальным криптографическим 'secure random' значением соответствующей
1420
+ длины, которая для `HMAC-SHA1` больше или равна 64 байтам (512 бит, 128
1421
+ шестнадцатеричных символов). Не рекомендуется использовать ключ, длина
1422
+ которого менее 32 байт (256 бит, 64 шестнадцатеричных символа). Поэтому
1423
+ **очень важно**, чтобы вы не просто составили значение ключа, а использовали
1424
+ генератор 'secure random' чисел для его создания. Люди очень плохо генерируют
1425
+ случайные значения.
1426
+
1427
+ По умолчанию, Sinatra создаёт для вас 'secure random' ключ сессии из 32 байт,
1428
+ но он будет меняться при каждом перезапуске приложения. Если у вас есть
1429
+ несколько экземпляров вашего приложения, и вы позволяете чтобы Sinatra
1430
+ генерировала ключ, то каждый экземпляр будет иметь отличный ключ сессии,
1431
+ который, вероятно, не тот, который вы хотите.
1432
+
1433
+ Для лучшей безопасности и удобства использования
1434
+ [рекомендуется](https://12factor.net/config) генерировать 'secure random'
1435
+ ключ и хранить его в переменной среды на каждом хосте, на котором запущено
1436
+ приложение, чтобы все экземпляры вашего приложения использовали один и тот
1437
+ же ключ. Вы должны периодически менять значение ключа сессии.
1438
+ Вот несколько примеров того, как вы можете создать ключ на 64 байта
1439
+ и установить его:
1440
+
1441
+ **Генерация ключа сессии**
1442
+
1443
+ ```text
1444
+ $ ruby -e "require 'securerandom'; puts SecureRandom.hex(64)"
1445
+ 99ae8af...snip...ec0f262ac
1446
+ ```
1447
+
1448
+ **Генерация ключа сессии (бонусные пункты)**
1449
+
1450
+ Используйте [гем 'sysrandom'](https://github.com/cryptosphere/sysrandom)
1451
+ Предпочтительнее использовать системные средства RNG для генерации случайных
1452
+ значений вместо пространства пользователя `OpenSSL`, для которого в данный
1453
+ момент по умолчанию используется MRI Ruby:
1454
+
1455
+ ```text
1456
+ $ gem install sysrandom
1457
+ Создание собственных расширений. Это может занять некоторое время...
1458
+ Успешно установлен sysrandom-1.x
1459
+ 1 gem установлен
1460
+
1461
+ $ ruby -e "require 'sysrandom/securerandom'; puts SecureRandom.hex(64)"
1462
+ 99ae8af...snip...ec0f262ac
1463
+ ```
1464
+
1465
+ **Переменная среды `SESSION_SECRET`**
1466
+
1467
+ Задайте переменной среды для Sinatra `SESSION_SECRET` значение, которое вы
1468
+ сгенерировали. Сделайте это значение постоянным при перезагрузке вашего
1469
+ хоста. Поскольку метод для генерации будет различным в разных системах,
1470
+ то код ниже приведён только в качестве примера:
1471
+
1472
+ ```bash
1473
+ # echo "export SESSION_SECRET=99ae8af...snip...ec0f262ac" >> ~/.bashrc
1474
+ ```
1475
+
1476
+ **Конфигурация приложения**
1477
+
1478
+ Настройте конфигурацию вашего приложения в безопасном режиме для
1479
+ 'secure random' ключа если переменная среды `SESSION_SECRET` не доступна.
1480
+
1481
+ В качестве бонусных пунктов здесь тоже используйте
1482
+ [гем 'sysrandom'gem](https://github.com/cryptosphere/sysrandom) :
1348
1483
 
1349
1484
  ```ruby
1350
- set :session_secret, 'super secret'
1485
+ require 'securerandom'
1486
+ # -или- require 'sysrandom/securerandom'
1487
+ set :session_secret, ENV.fetch('SESSION_SECRET') { SecureRandom.hex(64) }
1351
1488
  ```
1352
1489
 
1490
+ #### Конфигурация сессии
1491
+
1353
1492
  Если вы хотите больше настроек для сессий, вы можете задать их, передав хеш
1354
1493
  опций в параметр `sessions`:
1355
1494
 
@@ -1385,10 +1524,12 @@ set :session_store, Rack::Session::Pool
1385
1524
  ```
1386
1525
 
1387
1526
  Вы так же можете не вызывать `enable :sessions`, а вместо этого вызывать
1388
- необходимую вам прослойку так же, как вы это обычно делаете. Очень важно
1389
- обратить внимание на то, что когда вы используете этот метод, основной способ
1390
- защиты сессии **не будет включен по умолчанию**. Если вы хотите включить защиту,
1391
- вам нужно добавить следующие строчки:
1527
+ необходимую вам прослойку так же, как вы это обычно делаете.
1528
+
1529
+ Очень важно обратить внимание на то, что когда вы используете этот метод,
1530
+ основной способ защиты сессии **не будет включен по умолчанию**.
1531
+
1532
+ Если вы хотите включить защиту, вам нужно добавить следующие строчки:
1392
1533
 
1393
1534
  ```ruby
1394
1535
  use Rack::Session::Pool, :expire_after => 2592000
@@ -1477,8 +1618,8 @@ end
1477
1618
  производительность, перенеся `"bar"` в метод-помощник, используемый и в
1478
1619
  `/foo`, и в `/bar`.
1479
1620
 
1480
- Если вы хотите, чтобы запрос был отправлен в тот же экземпляр приложения, а не
1481
- в его копию, используйте `call!` вместо `call`.
1621
+ Если вы хотите, чтобы запрос был отправлен в тот же экземпляр приложения,
1622
+ а не в его копию, используйте `call!` вместо `call`.
1482
1623
 
1483
1624
  Если хотите узнать больше о `call`, смотрите спецификацию Rack.
1484
1625
 
@@ -1564,20 +1705,20 @@ set :server, :thin
1564
1705
  connections = []
1565
1706
 
1566
1707
  get '/subscribe' do
1567
- # регистрация клиента
1708
+ # регистрация клиента в событиях сервера
1568
1709
  stream(:keep_open) do |out|
1569
- connections << out }
1710
+ connections << out
1570
1711
  # удаление "мертвых клиентов"
1571
1712
  connections.reject!(&:closed?)
1572
1713
  end
1573
1714
  end
1574
1715
 
1575
- post '/message' do
1716
+ post '/:message' do
1576
1717
  connections.each do |out|
1577
1718
  # уведомить клиента о новом сообщении
1578
1719
  out << params['message'] << "\n"
1579
1720
 
1580
- # указать клиенту на необходимость снова соединиться
1721
+ # указать клиенту на необходимость снова соединиться
1581
1722
  out.close
1582
1723
  end
1583
1724
 
@@ -1586,6 +1727,9 @@ post '/message' do
1586
1727
  end
1587
1728
  ```
1588
1729
 
1730
+ Также клиент может закрыть соединение при попытке записи в сокет. В связи с
1731
+ этим рекомендуется проверить `out.closed?` прежде, чем пытаться записать.
1732
+
1589
1733
  ### Логирование
1590
1734
 
1591
1735
  В области видимости запроса метод `logger` предоставляет доступ к экземпляру
@@ -1671,7 +1815,7 @@ redirect to('/bar'), 303
1671
1815
  redirect 'http://www.google.com/', 'wrong place, buddy'
1672
1816
  ```
1673
1817
 
1674
- Вы также можете перенаправить пользователя обратно, на страницу, с которой он
1818
+ Вы также можете перенаправить пользователя обратно на страницу, с которой он
1675
1819
  пришел, с помощью `redirect back`:
1676
1820
 
1677
1821
  ```ruby
@@ -1698,12 +1842,12 @@ redirect to('/bar?sum=42')
1698
1842
  enable :sessions
1699
1843
 
1700
1844
  get '/foo' do
1701
- session['secret'] = 'foo'
1845
+ session[:secret] = 'foo'
1702
1846
  redirect to('/bar')
1703
1847
  end
1704
1848
 
1705
1849
  get '/bar' do
1706
- session['secret']
1850
+ session[:secret]
1707
1851
  end
1708
1852
  ```
1709
1853
 
@@ -1743,7 +1887,7 @@ end
1743
1887
  немедленно отправят ответ клиенту, если текущая версия уже есть в их кэше:
1744
1888
 
1745
1889
  ```ruby
1746
- get '/article/:id' do
1890
+ get "/article/:id" do
1747
1891
  @article = Article.find params['id']
1748
1892
  last_modified @article.updated_at
1749
1893
  etag @article.sha1
@@ -1763,8 +1907,8 @@ etag @article.sha1, :weak
1763
1907
  кэширования, попробуйте [rack-cache](https://github.com/rtomayko/rack-cache):
1764
1908
 
1765
1909
  ```ruby
1766
- require 'rack/cache'
1767
- require 'sinatra'
1910
+ require "rack/cache"
1911
+ require "sinatra"
1768
1912
 
1769
1913
  use Rack::Cache
1770
1914
 
@@ -1820,32 +1964,33 @@ send_file 'foo.png', :type => :jpg
1820
1964
 
1821
1965
  <dl>
1822
1966
  <dt>filename</dt>
1823
- <dd>имя файла, по умолчанию: реальное имя файла.</dd>
1967
+ <dd>имя файла, по умолчанию: реальное имя файла.</dd>
1824
1968
 
1825
1969
  <dt>last_modified</dt>
1826
- <dd>значение для заголовка Last-Modified, по умолчанию: mtime (время
1827
- изменения) файла.</dd>
1970
+ <dd>значение для заголовка Last-Modified, по умолчанию: mtime (время
1971
+ изменения) файла.</dd>
1828
1972
 
1829
1973
  <dt>type</dt>
1830
- <dd>тип файла, по умолчанию: определяется по расширению файла.</dd>
1974
+ <dd>тип файла, по умолчанию: определяется по расширению файла.</dd>
1831
1975
 
1832
1976
  <dt>disposition</dt>
1833
- <dd>используется для заголовка Content-Disposition, возможные значения: <tt>nil</tt>
1834
- (по умолчанию), <tt>:attachment</tt> и <tt>:inline</tt>.</dd>
1977
+ <dd>
1978
+ используется для заголовка Content-Disposition, возможные значения: <tt>nil</tt>
1979
+ (по умолчанию), <tt>:attachment</tt> и <tt>:inline</tt>
1980
+ </dd>
1835
1981
 
1836
1982
  <dt>length</dt>
1837
- <dd>значения для заголовка Content-Length, по умолчанию: размер файла.</dd>
1983
+ <dd>значения для заголовка Content-Length, по умолчанию: размер файла.</dd>
1838
1984
 
1839
1985
  <dt>status</dt>
1840
- <dd>Код ответа. Полезно, когда отдается статический файл в качестве страницы с
1841
- сообщением об ошибке.</dd>
1986
+ <dd>
1987
+ Код ответа. Полезно, когда отсылается статический файл в качестве страницы с
1988
+ сообщением об ошибке. Если поддерживается обработчик Rack, будут использоваться
1989
+ другие средства, кроме потоковой передачи из процесса Ruby. Если вы используете
1990
+ этот вспомогательный метод, Sinatra автоматически обрабатывает запросы диапазона.
1991
+ </dd>
1842
1992
  </dl>
1843
1993
 
1844
- Этот метод будет использовать возможности Rack сервера для отправки файлов,
1845
- если они доступны, в противном случае будет напрямую отдавать файл из Ruby
1846
- процесса. Метод `send_file` также обеспечивает автоматическую обработку
1847
- частичных (range) запросов с помощью Sinatra.
1848
-
1849
1994
  ### Доступ к объекту запроса
1850
1995
 
1851
1996
  Объект входящего запроса доступен на уровне обработки запроса (в фильтрах,
@@ -1934,7 +2079,7 @@ Sinatra предлагает метод-помощник `time_for`, котор
1934
2079
 
1935
2080
  ```ruby
1936
2081
  get '/' do
1937
- pass if Time.now > time_for('Dec 23, 2012')
2082
+ pass if Time.now > time_for('Dec 23, 2016')
1938
2083
  "still time"
1939
2084
  end
1940
2085
  ```
@@ -2007,10 +2152,10 @@ end
2007
2152
  Заметьте, что `find_template` не проверяет, существует ли файл на самом деле,
2008
2153
  а вызывает заданный блок для всех возможных путей. Дело тут не в
2009
2154
  производительности, дело в том, что `render` вызовет `break`, как только файл
2010
- не будет найден. Содержимое и местонахождение шаблонов будет закэшировано,
2011
- если приложение запущено не в режиме разработки (`set :environment,
2012
- :development`). Вы должны помнить об этих нюансах, если пишите по-настоящему
2013
- "сумасшедший" метод.
2155
+ будет найден. Содержимое и местонахождение шаблонов будет закэшировано, если
2156
+ приложение запущено не в режиме разработки (`set :environment, :development`).
2157
+ Вы должны помнить об этих нюансах, если пишите по-настоящему "сумасшедший"
2158
+ метод.
2014
2159
 
2015
2160
  ## Конфигурация
2016
2161
 
@@ -2036,7 +2181,7 @@ configure do
2036
2181
  end
2037
2182
  ```
2038
2183
 
2039
- Будет запущено, когда окружение (APP_ENV переменная) `:production`:
2184
+ Будет запущено, когда окружение (`APP_ENV` переменная) `:production`:
2040
2185
 
2041
2186
  ```ruby
2042
2187
  configure :production do
@@ -2090,174 +2235,217 @@ set :protection, :except => :path_traversal
2090
2235
  set :protection, :except => [:path_traversal, :session_hijacking]
2091
2236
  ```
2092
2237
 
2238
+ По умолчанию Sinatra будет устанавливать `session based` защиту только если
2239
+ включена опция `:sessions`. См. 'Использование сессий'. Иногда вы захотите
2240
+ настроить сессии "вне" приложения Sinatra, например, в config.ru или с помощью
2241
+ отдельного экземпляра `Rack::Builder`. В этом случае вы также можете настроить
2242
+ `session based` защиту, передав опцию `:session`:
2243
+
2244
+ ```ruby
2245
+ set :protection, :session => true
2246
+ ```
2247
+
2093
2248
  ### Доступные настройки
2094
2249
 
2095
2250
  <dl>
2096
2251
  <dt>absolute_redirects</dt>
2097
- <dd>
2098
- если отключено, то Sinatra будет позволять использование относительных
2099
- перенаправлений, но при этом перестанет соответствовать RFC 2616 (HTTP
2100
- 1.1), который разрешает только абсолютные перенаправления.
2101
- </dd>
2102
- <dd>
2103
- Включайте эту опцию, если ваше приложение работает за обратным прокси,
2104
- который настроен не совсем корректно. Обратите внимание, метод <tt>url</tt> все
2105
- равно будет генерировать абсолютные URL, если вы не передадите <tt>false</tt>
2106
- вторым аргументом.
2107
- </dd>
2108
- <dd>Отключено по умолчанию.</dd>
2252
+ <dd>
2253
+ если отключено, то Sinatra будет позволять использование относительных
2254
+ перенаправлений, но при этом перестанет соответствовать RFC 2616 (HTTP
2255
+ 1.1), который разрешает только абсолютные перенаправления.
2256
+ </dd>
2257
+ <dd>
2258
+ включайте эту опцию, если ваше приложение работает за обратным прокси,
2259
+ который настроен не совсем корректно. Обратите внимание, метод <tt>url</tt> все
2260
+ равно будет генерировать абсолютные URL, если вы не передадите <tt>false</tt>
2261
+ вторым аргументом.
2262
+ </dd>
2263
+ <dd>отключено по умолчанию.</dd>
2109
2264
 
2110
2265
  <dt>add_charset</dt>
2111
- <dd>
2112
- mime-типы, к которым метод <tt>content_type</tt> будет автоматически добавлять
2113
- информацию о кодировке. Вам следует добавлять значения к этой опции
2114
- вместо ее переопределения: <tt>settings.add_charset &lt;&lt; "application/foobar"</tt>
2115
- </dd>
2266
+ <dd>
2267
+ mime-типы, к которым метод <tt>content_type</tt> будет автоматически добавлять
2268
+ информацию о кодировке. Вам следует добавлять значения к этой опции
2269
+ вместо ее переопределения: <tt>settings.add_charset << "application/foobar"</tt>
2270
+ </dd>
2116
2271
 
2117
2272
  <dt>app_file</dt>
2118
- <dd>
2119
- путь к главному файлу приложения, используется для нахождения корневой
2120
- директории проекта, директорий с шаблонами и статическими файлами,
2121
- вложенных шаблонов.
2122
- </dd>
2273
+ <dd>
2274
+ путь к главному файлу приложения, используется для нахождения корневой
2275
+ директории проекта, директорий с шаблонами и статическими файлами,
2276
+ вложенных шаблонов.
2277
+ </dd>
2123
2278
 
2124
2279
  <dt>bind</dt>
2125
- <dd>
2126
- используемый IP-адрес (по умолчанию: 0.0.0.0). Используется только
2127
- встроенным сервером.
2128
- </dd>
2280
+ <dd>
2281
+ используемый IP-адрес (по умолчанию: <tt>0.0.0.0</tt> <em>или</em>
2282
+ <tt>localhost</tt> если ваша `environment` настроена на разработку).
2283
+ Используется только встроенным сервером.
2284
+ </dd>
2129
2285
 
2130
2286
  <dt>default_encoding</dt>
2131
- <dd>кодировка, если неизвестна (по умолчанию: <tt>"utf-8"</tt>).</dd>
2287
+ <dd>кодировка, если неизвестна (по умолчанию: <tt>"utf-8"</tt>).</dd>
2132
2288
 
2133
2289
  <dt>dump_errors</dt>
2134
- <dd>отображать ошибки в логе.</dd>
2290
+ <dd>отображать ошибки в логе.</dd>
2135
2291
 
2136
2292
  <dt>environment</dt>
2137
- <dd>
2138
- текущее окружение, по умолчанию, значение <tt>ENV['APP_ENV']</tt> или
2139
- <tt>"development"</tt>, если <tt>ENV['APP_ENV']</tt> недоступна.
2140
- </dd>
2293
+ <dd>
2294
+ текущее окружение, по умолчанию, значение <tt>ENV['APP_ENV']</tt> или
2295
+ <tt>"development"</tt>, если <tt>ENV['APP_ENV']</tt> недоступна.
2296
+ </dd>
2141
2297
 
2142
2298
  <dt>logging</dt>
2143
- <dd>использовать логер.</dd>
2299
+ <dd>использовать логер.</dd>
2144
2300
 
2145
2301
  <dt>lock</dt>
2146
- <dd>
2147
- создает блокировку для каждого запроса, которая гарантирует обработку
2148
- только одного запроса в текущий момент времени в Ruby процессе.
2302
+ <dd>
2303
+ создает блокировку для каждого запроса, которая гарантирует обработку
2304
+ только одного запроса в текущий момент времени в Ruby процессе.
2305
+ </dd>
2306
+ <dd>
2307
+ включайте, если ваше приложение не потоко-безопасно (thread-safe).
2308
+ Отключено по умолчанию.
2149
2309
  </dd>
2150
- <dd>
2151
- Включайте, если ваше приложение не потоко-безопасно (thread-safe).
2152
- Отключено по умолчанию.</dd>
2153
2310
 
2154
2311
  <dt>method_override</dt>
2155
- <dd>
2156
- использовать "магический" параметр <tt>_method</tt>, для поддержки
2157
- PUT/DELETE форм в браузерах, которые не поддерживают эти методы.
2158
- </dd>
2312
+ <dd>
2313
+ использовать "магический" параметр <tt>_method</tt>, для поддержки
2314
+ PUT/DELETE форм в браузерах, которые не поддерживают эти методы.
2315
+ </dd>
2316
+
2317
+ <dt>mustermann_opts</dt>
2318
+ <dd>
2319
+ хэш настроек по умолчанию для перехода к Mustermann.new при компиляции
2320
+ маршрутов маршрутизации.
2321
+ </dd>
2159
2322
 
2160
2323
  <dt>port</dt>
2161
- <dd>
2162
- порт, на котором будет работать сервер.
2163
- Используется только встроенным сервером.
2164
- </dd>
2324
+ <dd>
2325
+ порт, на котором будет работать сервер.
2326
+ Используется только встроенным сервером.
2327
+ </dd>
2165
2328
 
2166
2329
  <dt>prefixed_redirects</dt>
2167
- <dd>
2168
- добавлять или нет параметр <tt>request.script_name</tt> к редиректам, если не
2169
- задан абсолютный путь. Таким образом, <tt>redirect '/foo'</tt> будет вести себя
2170
- как <tt>redirect to('/foo')</tt>. Отключено по умолчанию.
2171
- </dd>
2330
+ <dd>
2331
+ добавлять или нет параметр <tt>request.script_name</tt> к редиректам, если не
2332
+ задан абсолютный путь. Таким образом, <tt>redirect '/foo'</tt> будет вести себя
2333
+ как <tt>redirect to('/foo')</tt>. Отключено по умолчанию.
2334
+ </dd>
2172
2335
 
2173
2336
  <dt>protection</dt>
2174
- <dd>включена или нет защита от атак. Смотрите секцию выше.</dd>
2337
+ <dd>включена или нет защита от атак. Смотрите секцию защиты от атак выше.</dd>
2175
2338
 
2176
2339
  <dt>public_dir</dt>
2177
- <dd>Алиас для <tt>public_folder</tt>.</dd>
2340
+ <dd>алиас для <tt>public_folder</tt>.</dd>
2178
2341
 
2179
2342
  <dt>public_folder</dt>
2180
- <dd>
2181
- путь к директории, откуда будут раздаваться статические файлы.
2182
- Используется, только если включена раздача статических файлов
2183
- (см. опцию <tt>static</tt> ниже).
2184
- </dd>
2343
+ <dd>
2344
+ путь к общедоступной директории, откуда будут раздаваться файлы.
2345
+ Используется, только если включена раздача статических файлов
2346
+ (см. опцию <tt>static</tt> ниже). Берётся из настройки <tt>app_file</tt>,
2347
+ если не установлена.
2348
+ </dd>
2349
+
2350
+ <dt>quiet</dt>
2351
+ <dd>
2352
+ отключает журналы, созданные командами запуска и остановки Sinatra.
2353
+ <tt>false</tt> по умолчанию.
2354
+ </dd>
2185
2355
 
2186
2356
  <dt>reload_templates</dt>
2187
- <dd>
2188
- перезагружать или нет шаблоны на каждый запрос. Включено в режиме
2189
- разработки.
2190
- </dd>
2357
+ <dd>
2358
+ перезагружать или нет шаблоны на каждый запрос. Включено в режиме
2359
+ разработки.
2360
+ </dd>
2191
2361
 
2192
2362
  <dt>root</dt>
2193
- <dd>путь к корневой директории проекта.</dd>
2363
+ <dd>
2364
+ путь к корневой директории проекта. Берётся из настройки <tt>app_file</tt>,
2365
+ если не установлен.
2366
+ </dd>
2194
2367
 
2195
2368
  <dt>raise_errors</dt>
2196
- <dd>
2197
- выбрасывать исключения (будет останавливать приложение).
2198
- По умолчанию включено только в окружении <tt>test</tt>.
2199
- </dd>
2369
+ <dd>
2370
+ выбрасывать исключения (будет останавливать приложение).
2371
+ По умолчанию включено только в окружении <tt>"test"</tt>.
2372
+ </dd>
2200
2373
 
2201
2374
  <dt>run</dt>
2202
- <dd>
2203
- если включено, Sinatra будет самостоятельно запускать веб-сервер. Не
2204
- включайте, если используете rackup или аналогичные средства.
2205
- </dd>
2375
+ <dd>
2376
+ если включено, Sinatra будет самостоятельно запускать веб-сервер. Не
2377
+ включайте, если используете rackup или аналогичные средства.
2378
+ </dd>
2206
2379
 
2207
2380
  <dt>running</dt>
2208
- <dd>работает ли сейчас встроенный сервер? Не меняйте эту опцию!</dd>
2381
+ <dd>работает ли сейчас встроенный сервер? Не меняйте эту опцию!</dd>
2209
2382
 
2210
2383
  <dt>server</dt>
2211
- <dd>
2212
- сервер или список серверов, которые следует использовать в качестве
2213
- встроенного сервера. По умолчанию: <tt>['thin', 'mongrel', 'webrick']</tt>, порядок
2214
- задает приоритет.</dd>
2384
+ <dd>
2385
+ сервер или список серверов, которые следует использовать в качестве
2386
+ встроенного сервера. Порядок задает приоритет, по умолчанию зависит
2387
+ от реализации Ruby.
2388
+ </dd>
2215
2389
 
2216
2390
  <dt>sessions</dt>
2217
- <dd>
2218
- включить сессии на основе кук (cookie) на базе <tt>Rack::Session::Cookie</tt>.
2391
+ <dd>
2392
+ включить сессии на основе кук (cookie) на базе <tt>Rack::Session::Cookie</tt>.
2393
+ Смотрите секцию "Использование сессий" выше.
2394
+ </dd>
2395
+
2396
+ <dt>session_store</dt>
2397
+ <dd>
2398
+ используется Rack "прослойка" сессии. По умолчанию <tt>Rack::Session::Cookie</tt>.
2219
2399
  Смотрите секцию "Использование сессий" выше.
2220
- </dd>
2400
+ </dd>
2221
2401
 
2222
2402
  <dt>show_exceptions</dt>
2223
- <dd>
2224
- показывать исключения/стек вызовов (stack trace) в браузере. По умолчанию
2225
- включено только в окружении <tt>development</tt>.
2226
- </dd>
2227
- <dd>
2228
- Может быть установлено в
2229
- <tt>:after_handler</tt> для запуска специфичной для приложения обработки ошибок,
2230
- перед показом трассировки стека в браузере.
2231
- </dd>
2403
+ <dd>
2404
+ показывать исключения/стек вызовов (stack trace) в браузере. По умолчанию
2405
+ включено только в окружении <tt>"development"</tt>.
2406
+ </dd>
2407
+ <dd>
2408
+ может также быть установлено в <tt>:after_handler</tt> для запуска специфичной
2409
+ для приложения обработки ошибок, перед показом трассировки стека в браузере.
2410
+ </dd>
2232
2411
 
2233
2412
  <dt>static</dt>
2234
- <dd>должна ли Sinatra осуществлять раздачу статических файлов.</dd>
2235
- <dd>Отключите, когда используете какой-либо веб-сервер для этой цели.</dd>
2236
- <dd>Отключение значительно улучшит производительность приложения.</dd>
2237
- <dd>По умолчанию включено в классических и отключено в модульных приложениях.</dd>
2413
+ <dd>должна ли Sinatra осуществлять раздачу статических файлов.</dd>
2414
+ <dd>Отключите, когда используете какой-либо веб-сервер для этой цели.</dd>
2415
+ <dd>Отключение значительно улучшит производительность приложения.</dd>
2416
+ <dd>По умолчанию включено в классических и отключено в модульных приложениях.</dd>
2238
2417
 
2239
2418
  <dt>static_cache_control</dt>
2240
- <dd>
2241
- когда Sinatra отдает статические файлы, используйте эту опцию, чтобы
2242
- добавить им заголовок <tt>Cache-Control</tt>. Для этого используется
2243
- метод-помощник <tt>cache_control</tt>. По умолчанию отключено.
2244
- </dd>
2245
- <dd>
2246
- Используйте массив, когда надо задать несколько значений:
2247
- <tt>set :static_cache_control, [:public, :max_age => 300]</tt>
2248
- </dd>
2419
+ <dd>
2420
+ когда Sinatra отдает статические файлы, используйте эту опцию, чтобы
2421
+ добавить им заголовок <tt>Cache-Control</tt>. Для этого используется
2422
+ метод-помощник <tt>cache_control</tt>. По умолчанию отключено.
2423
+ </dd>
2424
+ <dd>
2425
+ используйте массив, когда надо задать несколько значений:
2426
+ <tt>set :static_cache_control, [:public, :max_age => 300]</tt>
2427
+ </dd>
2249
2428
 
2250
2429
  <dt>threaded</dt>
2251
- <dd>
2252
- если включено, то Thin будет использовать <tt>EventMachine.defer</tt> для
2253
- обработки запросов.
2254
- </dd>
2430
+ <dd>
2431
+ если включено, то Thin будет использовать <tt>EventMachine.defer</tt> для
2432
+ обработки запросов.
2433
+ </dd>
2255
2434
 
2256
2435
  <dt>traps</dt>
2257
- <dd>должна ли Синатра обрабатывать системные сигналы или нет.</tt></dd>
2436
+ <dd>должна ли Sinatra обрабатывать системные сигналы или нет.</tt></dd>
2258
2437
 
2259
2438
  <dt>views</dt>
2260
- <dd>путь к директории с шаблонами.</dd>
2439
+ <dd>
2440
+ путь к директории с шаблонами. Берётся из настройки <tt>app_file</tt>,
2441
+ если не установлен.
2442
+ </dd>
2443
+
2444
+ <dt>x_cascade</dt>
2445
+ <dd>
2446
+ Установлен ли заголовок X-Cascade если никакие маршруты не совпадают.
2447
+ <tt>true</tt> по умолчанию.
2448
+ </dd>
2261
2449
  </dl>
2262
2450
 
2263
2451
  ## Режим, окружение
@@ -2269,14 +2457,25 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2269
2457
  `not_found` и `error`, чтобы вы могли увидеть стек вызовов. В окружениях
2270
2458
  `"production"` и `"test"` шаблоны по умолчанию кэшируются.
2271
2459
 
2272
- Для запуска приложения в определенном окружении используйте ключ `-e`
2460
+ Для запуска приложения в определенном окружении установите переменную
2461
+ окружения `APP_ENV`:
2273
2462
 
2274
- ```
2275
- ruby my_app.rb -e [ENVIRONMENT]
2463
+ ```shell
2464
+ APP_ENV=production ruby my_app.rb
2276
2465
  ```
2277
2466
 
2278
2467
  Вы можете использовать предопределенные методы `development?`, `test?` и
2279
- +production?, чтобы определить текущее окружение.
2468
+ `production?`, чтобы определить текущее окружение.
2469
+
2470
+ ```ruby
2471
+ get '/' do
2472
+ if settings.development?
2473
+ "development!"
2474
+ else
2475
+ "not development!"
2476
+ end
2477
+ end
2478
+ ```
2280
2479
 
2281
2480
  ## Обработка ошибок
2282
2481
 
@@ -2298,8 +2497,15 @@ end
2298
2497
  ### Error
2299
2498
 
2300
2499
  Обработчик ошибок `error` будет вызван, когда исключение выброшено из блока
2301
- маршрута, либо из фильтра. Объект-исключение доступен как переменная
2302
- `sinatra.error` в Rack:
2500
+ маршрута, либо из фильтра. Но заметьте, что в режиме разработки он будет
2501
+ запускаться, только если вы установите опцию "show exceptions"
2502
+ на `: after_handler`:
2503
+
2504
+ ```ruby
2505
+ set :show_exceptions, :after_handler
2506
+ ```
2507
+
2508
+ Объект-исключение доступен как переменная `sinatra.error` в Rack:
2303
2509
 
2304
2510
  ```ruby
2305
2511
  error do
@@ -2350,9 +2556,11 @@ end
2350
2556
  ```
2351
2557
 
2352
2558
  Sinatra устанавливает специальные `not_found` и `error` обработчики, когда
2353
- приложение запущено в режиме разработки (окружение `:development`).
2559
+ приложение запущено в режиме разработки (окружение `:development`) чтобы
2560
+ отображать хорошие трассировки стека и дополнительную информацию об отладке
2561
+ в вашем браузере.
2354
2562
 
2355
- ## Rack "прослойки"
2563
+ ## Rack "прослойка"
2356
2564
 
2357
2565
  Sinatra использует [Rack](http://rack.github.io/), минимальный стандартный
2358
2566
  интерфейс для веб-фреймворков на Ruby. Одной из самых интересных для
@@ -2433,16 +2641,18 @@ class MyAppTest < Minitest::Test
2433
2641
  end
2434
2642
  ```
2435
2643
 
2644
+ Примечание: если вы используете Sinatra в модульном стиле, замените
2645
+ `Sinatra::Application` в примере выше выше на имя класса вашего приложения.
2646
+
2436
2647
  ## Sinatra::Base — "прослойки", библиотеки и модульные приложения
2437
2648
 
2438
- Описание своего приложения самым простейшим способом помощью DSL верхнего
2439
- уровня, классический стиль) отлично работает для крохотных приложений. В таких
2440
- случаях используется конфигурация, рассчитанная на микро-приложения
2441
- (единственный файл приложения, `./public` и `./views` директории, логирование,
2442
- страница информации об исключении и т.д.). Тем не менее, такой метод имеет
2443
- множество недостатков при создании компонентов, таких как Rack middleware
2444
- ("прослоек"), Rails metal, простых библиотек с серверными компонентами,
2445
- расширений Sinatra. И тут на помощь приходит `Sinatra::Base`:
2649
+ Описание вашего приложения на верхнем уровне хорошо работает для микроприложений,
2650
+ но имеет значительные недостатки при создании многоразовых компонентов, таких как
2651
+ Rack "прослойка", Rails metal, простые библиотеки с серверным компонентом или
2652
+ даже расширения Sinatra. Верхний уровень предполагает конфигурацию стиля
2653
+ микроприложений (например, одиночный файл приложения, `./public` и `./views`,
2654
+ каталоги, логгирование, страницу подробных сведений об исключениях и т.д.).
2655
+ И тут на помощь приходит `Sinatra::Base`:
2446
2656
 
2447
2657
  ```ruby
2448
2658
  require 'sinatra/base'
@@ -2461,16 +2671,29 @@ end
2461
2671
  приложениям в DSL верхнего уровня. Большинство таких приложений могут быть
2462
2672
  конвертированы в `Sinatra::Base` компоненты с помощью двух модификаций:
2463
2673
 
2464
- * Вы должны подключать `sinatra/base` вместо `sinatra`, иначе все методы,
2674
+ * Вы должны подключать `sinatra/base` вместо `sinatra`, иначе все DSL методы,
2465
2675
  предоставляемые Sinatra, будут импортированы в глобальное пространство
2466
2676
  имен.
2467
2677
  * Поместите все маршруты, обработчики ошибок, фильтры и опции в подкласс
2468
2678
  `Sinatra::Base`.
2469
2679
 
2470
2680
  `Sinatra::Base` — это чистый лист. Большинство опций, включая встроенный
2471
- сервер, по умолчанию отключены. Смотрите
2472
- [Опции и конфигурация](http://www.sinatrarb.com/configuration.html)
2473
- для детальной информации об опциях и их поведении.
2681
+ сервер, по умолчанию отключены. Смотрите
2682
+ [Опции и конфигурация](http://www.sinatrarb.com/configuration.html)
2683
+ для детальной информации об опциях и их поведении. Если вы хотите, чтобы
2684
+ поведение было более похоже на то, когда вы определяете свое приложение
2685
+ на верхнем уровне (также известно как классический стиль), вы можете
2686
+ подклассифицировать `Sinatra::Application`:
2687
+
2688
+ ```ruby
2689
+ require 'sinatra/base'
2690
+
2691
+ class MyApp < Sinatra::Application
2692
+ get '/' do
2693
+ 'Hello world!'
2694
+ end
2695
+ end
2696
+ ```
2474
2697
 
2475
2698
  ### Модульные приложения против классических
2476
2699
 
@@ -2486,14 +2709,56 @@ end
2486
2709
  Переходя с одного стиля на другой, примите во внимание следующие изменения в
2487
2710
  настройках:
2488
2711
 
2489
- Опция Классический Модульный
2712
+ <table>
2713
+ <tr>
2714
+ <th>Опция</th>
2715
+ <th>Классический</th>
2716
+ <th>Модульный</th>
2717
+ <th>Модульный</th>
2718
+ </tr>
2719
+
2720
+ <tr>
2721
+ <td>app_file</td>
2722
+ <td>файл с приложением</td>
2723
+ <td>файл с подклассом Sinatra::Base</td>
2724
+ <td>файл с подклассом Sinatra::Application</td>
2725
+ </tr>
2726
+
2727
+ <tr>
2728
+ <td>run</td>
2729
+ <td>$0 == app_file</td>
2730
+ <td>false</td>
2731
+ <td>false</td>
2732
+ </tr>
2733
+
2734
+ <tr>
2735
+ <td>logging</td>
2736
+ <td>true</td>
2737
+ <td>false</td>
2738
+ <td>true</td>
2739
+ </tr>
2740
+
2741
+ <tr>
2742
+ <td>method_override</td>
2743
+ <td>true</td>
2744
+ <td>false</td>
2745
+ <td>true</td>
2746
+ </tr>
2747
+
2748
+ <tr>
2749
+ <td>inline_templates</td>
2750
+ <td>true</td>
2751
+ <td>false</td>
2752
+ <td>true</td>
2753
+ </tr>
2490
2754
 
2491
- app_file файл с приложением файл с подклассом Sinatra::Base
2492
- run $0 == app_file false
2493
- logging true false
2494
- method_override true false
2495
- inline_templates true false
2496
- static true File.exist?(public_folder)
2755
+ <tr>
2756
+ <td>static</td>
2757
+ <td>true</td>
2758
+ <td>File.exist?(public_folder)</td>
2759
+ <td>true</td>
2760
+ </tr>
2761
+ </table>
2497
2762
 
2498
2763
  ### Запуск модульных приложений
2499
2764
 
@@ -2514,7 +2779,7 @@ end
2514
2779
 
2515
2780
  Затем:
2516
2781
 
2517
- ```
2782
+ ```shell
2518
2783
  ruby my_app.rb
2519
2784
  ```
2520
2785
 
@@ -2522,14 +2787,14 @@ ruby my_app.rb
2522
2787
  использовать любой Rack-совместимый сервер приложений.
2523
2788
 
2524
2789
  ```ruby
2525
- # config.ru
2790
+ # config.ru (запускается с помощью Rackup)
2526
2791
  require './my_app'
2527
2792
  run MyApp
2528
2793
  ```
2529
2794
 
2530
2795
  Запускаем:
2531
2796
 
2532
- ```
2797
+ ```shell
2533
2798
  rackup -p 4567
2534
2799
  ```
2535
2800
 
@@ -2573,7 +2838,7 @@ run Sinatra::Application
2573
2838
  Не только сама Sinatra может использовать "прослойки" Rack, но и любое Sinatra
2574
2839
  приложение само может быть добавлено к любому Rack endpoint в качестве
2575
2840
  "прослойки". Этим endpoint (конечной точкой) может быть другое Sinatra
2576
- приложение, или приложение, основанное на Rack (Rails/Ramaze/Camping/...):
2841
+ приложение, или приложение, основанное на Rack (Rails/Hamami/Roda/...):
2577
2842
 
2578
2843
  ```ruby
2579
2844
  require 'sinatra/base'
@@ -2621,7 +2886,7 @@ my_app.run!
2621
2886
  наследоваться:
2622
2887
 
2623
2888
  ```ruby
2624
- # config.ru
2889
+ # config.ru (запускается с помощью Rackup)
2625
2890
  require 'sinatra/base'
2626
2891
 
2627
2892
  controller = Sinatra.new do
@@ -2723,8 +2988,8 @@ end
2723
2988
 
2724
2989
  У вас будет область видимости запроса в:
2725
2990
 
2726
- * get/head/post/put/delete/options блоках;
2727
- * before/after фильтрах;
2991
+ * get, head, post, put, delete, options, patch, link и unlink блоках;
2992
+ * before и after фильтрах;
2728
2993
  * методах-помощниках;
2729
2994
  * шаблонах/отображениях.
2730
2995
 
@@ -2740,7 +3005,7 @@ end
2740
3005
 
2741
3006
  У вас будет контекст делегирования внутри:
2742
3007
 
2743
- * привязки верхнего уровня, если вы сделали `require 'sinatra'`;
3008
+ * привязки верхнего уровня, если вы сделали `require "sinatra"`;
2744
3009
  * объекта, расширенного с помощью `Sinatra::Delegator`.
2745
3010
 
2746
3011
  Посмотрите сами в код: вот
@@ -2751,8 +3016,8 @@ end
2751
3016
 
2752
3017
  Sinatra приложения могут быть запущены напрямую:
2753
3018
 
2754
- ```
2755
- ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
3019
+ ```shell
3020
+ ruby myapp.rb [-h] [-x] [-q] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
2756
3021
  ```
2757
3022
 
2758
3023
  Опции включают:
@@ -2763,6 +3028,7 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
2763
3028
  -o # указание хоста (по умолчанию 0.0.0.0)
2764
3029
  -e # указание окружения, режима (по умолчанию development)
2765
3030
  -s # указание rack сервера/обработчика (по умолчанию thin)
3031
+ -q # включить тихий режим для сервера (по умолчанию выключен)
2766
3032
  -x # включить мьютекс-блокировку (по умолчанию выключена)
2767
3033
  ```
2768
3034
 
@@ -2790,6 +3056,7 @@ class App < Sinatra::Base
2790
3056
  end
2791
3057
 
2792
3058
  App.run!
3059
+
2793
3060
  ```
2794
3061
 
2795
3062
  Чтобы запустить сервер, вы должны выполнить следующую команду:
@@ -2798,48 +3065,35 @@ App.run!
2798
3065
  thin --threaded start
2799
3066
  ```
2800
3067
 
3068
+
2801
3069
  [so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
2802
3070
 
2803
3071
  ## Системные требования
2804
3072
 
2805
3073
  Следующие версии Ruby официально поддерживаются:
2806
-
2807
3074
  <dl>
2808
- <dt>Ruby 1.8.7</dt>
2809
- <dd>1.8.7 полностью поддерживается, тем не менее, если вас ничто не держит на
2810
- этой версии, рекомендуем обновиться до 1.9.2 или перейти на JRuby или
2811
- Rubinius. Поддержка 1.8.7 не будет прекращена до выхода Sinatra 2.0 и Ruby
2812
- 2.0, разве что в случае релиза 1.8.8 (что маловероятно). Но даже тогда,
2813
- возможно, поддержка не будет прекращена. <b>Ruby 1.8.6 больше не
2814
- поддерживается.</b> Если вы хотите использовать 1.8.6, откатитесь до Sinatra
2815
- 1.2, которая будет получать все исправления ошибок до тех пор, пока не
2816
- будет выпущена Sinatra 1.4.0.</dd>
2817
-
2818
- <dt>Ruby 1.9.2</dt>
2819
- <dd>1.9.2 полностью поддерживается и рекомендована к использованию.
2820
- Не используйте 1.9.2p0,
2821
- известно, что эта версия очень нестабильна при использовании Sinatra. Эта
2822
- версия будет поддерживаться по крайней мере до выхода Ruby 1.9.4/2.0, а
2823
- поддержка последней версии 1.9 будет осуществляться до тех пор, пока она
2824
- поддерживается командой разработчиков Ruby.</dd>
2825
-
2826
- <dt>Ruby 1.9.3</dt>
2827
- <dd>1.9.3 полностью поддерживается. Заметьте, что переход на 1.9.3 с
2828
- ранних версий сделает недействительными все сессии.</dd>
3075
+ <dt>Ruby 2.2</dt>
3076
+ <dd>
3077
+ 2.2 полностью поддерживается и рекомендуется. В настоящее время нет
3078
+ планов отказаться от официальной поддержки.
3079
+ </dd>
2829
3080
 
2830
3081
  <dt>Rubinius</dt>
2831
- <dd>Rubinius официально поддерживается (Rubinius &gt;= 1.2.4), всё, включая все
2832
- языки шаблонов, работает. Предстоящий релиз 2.0 также поддерживается.</dd>
3082
+ <dd>
3083
+ Rubinius официально поддерживается (Rubinius >= 2.x). Рекомендуется
3084
+ выполнить <tt>gem install puma</tt>.
3085
+ </dd>
2833
3086
 
2834
3087
  <dt>JRuby</dt>
2835
- <dd>JRuby официально поддерживается (JRuby &gt;= 1.6.5). Нет никаких проблем с
2836
- использованием альтернативных шаблонов. Тем не менее, если вы выбираете
2837
- JRuby, то, пожалуйста, посмотрите на JRuby Rack-серверы, так как Thin не
2838
- поддерживается полностью на JRuby. Поддержка расширений на C в JRuby все
2839
- еще экспериментальная, что на данный момент затрагивает только RDiscount,
2840
- Redcarpet и RedCloth.</dd>
3088
+ <dd>
3089
+ Официально поддерживается последний стабильный релиз JRuby. Не
3090
+ рекомендуется использовать расширений на C в JRuby. Рекомендуется
3091
+ выполнить <tt>gem install trinidad</tt>.
3092
+ </dd>
2841
3093
  </dl>
2842
3094
 
3095
+ Версии Ruby старше 2.2.2 больше не поддерживаются в Sinatra 2.0.
3096
+
2843
3097
  Мы также следим за предстоящими к выходу версиями Ruby.
2844
3098
 
2845
3099
  Следующие реализации Ruby не поддерживаются официально, но известно, что на
@@ -2854,16 +3108,17 @@ thin --threaded start
2854
3108
  работает на этой версии, а на поддерживаемой работает — это не наша проблема,
2855
3109
  а их.
2856
3110
 
2857
- Мы также запускаем наши CI-тесты на версии Ruby, находящейся в разработке
2858
- (предстоящей 2.0.0), и на 1.9.4, но мы не можем ничего гарантировать, так как
2859
- они находятся в разработке. Предполагается, что 1.9.4p0 и 2.0.0p0 будут
2860
- поддерживаться.
3111
+ Мы также запускаем наши CI-тесты на ruby-head (будущие версии MRI), но мы не
3112
+ можем ничего гарантировать, так как ведётся постоянная разработка.
3113
+ Предполагается, что предстоящие релизы 2.x будут полностью поддерживаться.
2861
3114
 
2862
3115
  Sinatra должна работать на любой операционной системе, в которой есть одна из
2863
3116
  указанных выше версий Ruby.
2864
3117
 
3118
+ Если вы запускаете MacRuby, вы должны выполнить `gem install control_tower`.
3119
+
2865
3120
  Пока невозможно запустить Sinatra на Cardinal, SmallRuby, BlueRuby и на любой
2866
- версии Ruby до 1.8.7.
3121
+ версии Ruby старше 2.2.
2867
3122
 
2868
3123
  ## На острие
2869
3124
 
@@ -2873,7 +3128,7 @@ Sinatra должна работать на любой операционной
2873
3128
  Мы также время от времени выпускаем предварительные версии, так что вы можете
2874
3129
  делать так:
2875
3130
 
2876
- ```
3131
+ ```shell
2877
3132
  gem install sinatra --pre
2878
3133
  ```
2879
3134
 
@@ -2886,28 +3141,27 @@ gem install sinatra --pre
2886
3141
 
2887
3142
  Сначала установите Bundler, если у вас его еще нет:
2888
3143
 
2889
- ```
3144
+ ```shell
2890
3145
  gem install bundler
2891
3146
  ```
2892
3147
 
2893
3148
  Затем создайте файл `Gemfile` в директории вашего проекта:
2894
3149
 
2895
3150
  ```ruby
2896
- source :rubygems
2897
- gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
3151
+ source 'https://rubygems.org'
3152
+ gem 'sinatra', :github => 'sinatra/sinatra'
2898
3153
 
2899
3154
  # другие зависимости
2900
3155
  gem 'haml' # например, если используете haml
2901
- gem 'activerecord', '~> 3.0' # может быть, вам нужен и ActiveRecord 3.x
2902
3156
  ```
2903
3157
 
2904
3158
  Обратите внимание, вам нужно будет указывать все зависимости вашего приложения
2905
- в этом файле. Однако, непосредственные зависимости Sinatra (Rack и Tilt)
3159
+ в `Gemfile`. Однако, непосредственные зависимости Sinatra (Rack и Tilt)
2906
3160
  Bundler автоматически скачает и добавит.
2907
3161
 
2908
3162
  Теперь вы можете запускать свое приложение так:
2909
3163
 
2910
- ```
3164
+ ```shell
2911
3165
  bundle exec ruby myapp.rb
2912
3166
  ```
2913
3167