1
0
Fork 0
mirror of https://github.com/sinatra/sinatra synced 2023-03-27 23:18:01 -04:00

Merge pull request #460 from vast/ru-readme-sync-2-judgement-day

README.ru.rdoc sync
This commit is contained in:
Konstantin Haase 2012-01-31 01:13:40 -08:00
commit 80b98a22a8

View file

@ -1,7 +1,8 @@
= Sinatra
<i>Внимание: Этот документ является переводом английской версии и может быть устаревшим</i>
Sinatra — это предметно-ориентированный каркас (DSL) для быстрого создания функциональных веб-приложений на Ruby:
Sinatra — это предметно-ориентированный каркас (DSL) для быстрого создания функциональных
веб-приложений на Ruby с минимумом усилий:
# myapp.rb
require 'sinatra'
@ -18,15 +19,15 @@ Sinatra — это предметно-ориентированный карка
ruby -rubygems myapp.rb
Результат можно увидеть: http://localhost:4567
Оцените результат: http://localhost:4567
Рекомендуется также установить thin, сделать это можно командой: <tt>gem install thin</tt>.
Thin - это более производительный и функциональный сервер для разработки приложений на Sinatra.
Рекомендуется также установить Thin, сделать это можно командой: <tt>gem install thin</tt>.
Thin это более производительный и функциональный сервер для разработки приложений на Sinatra.
== Маршруты
В Sinatra маршрут — это пара: <HTTP метод> и <шаблон URL>.
Каждый маршрут ассоциирован с блоком кода, исполняемого внутри, пример:
Каждый маршрут связан с блоком кода:
get '/' do
.. что-то показать ..
@ -52,11 +53,11 @@ Thin - это более производительный и функциона
.. что-то ответить ..
end
Маршруты сверяются с запросом в порядке очередности их записи в файле приложения. По умолчанию
будет вызван первый совпавший с запросом маршрут.
Маршруты сверяются с запросом в порядке очередности их записи в файле приложения.
Первый же совпавший с запросом маршрут и будет вызван.
Шаблоны маршрутов могут включать в себя параметры доступные в
<tt>params</tt> xэше:
Шаблоны маршрутов могут включать в себя именные параметры доступные
в xэше <tt>params</tt>:
get '/hello/:name' do
# соответствует "GET /hello/foo" и "GET /hello/bar",
@ -64,14 +65,16 @@ Thin - это более производительный и функциона
"Hello #{params[:name]}!"
end
Можно также использовать именные параметры в переменных блоков:
Также можно использовать именные параметры в качестве переменных
блока:
get '/hello/:name' do |n|
"Hello #{n}!"
end
Шаблоны маршрутов также могут включать splat (или '*' маску, обозначающую любой символ) параметры доступные
в массиве <tt>params[:splat]</tt>:
Шаблоны маршрутов также могут включать в себя splat (или '*'
маску, обозначающую любой символ) параметры доступные в массиве
<tt>params[:splat]</tt>:
get '/say/*/to/*' do
# соответствует /say/hello/to/world
@ -89,7 +92,7 @@ Thin - это более производительный и функциона
[path, ext] # => ["path/to/file", "xml"]
end
Маршруты также могут содержать регулярные выражения:
Регулярные выражения в качестве шаблонов маршрутов:
get %r{/hello/([\w]+)} do
"Hello, #{params[:captures].first}!"
@ -101,16 +104,27 @@ Thin - это более производительный и функциона
"Hello, #{c}!"
end
Шаблоны маршрутов могут иметь необязательные параметры:
get '/posts.?:format?' do
# соответствует "GET /posts", "GET /posts.json", "GET /posts.xml" и т.д.
end
Кстати, если вы не отключите защиту от обратного пути в директориях
(path traversal, см. ниже), путь запроса может быть изменен до начала
поиска подходящего маршрута.
=== Условия
Маршруты могут включать различные условия совпадений, такие как user agent:
Маршруты могут включать различные условия совпадений, например,
клиентской приложение (user agent):
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
"You're using Songbird version #{params[:agent][0]}"
end
get '/foo' do
# соответствует non-songbird браузерам
# соответствует не-songbird браузерам
end
Другими доступными условиями являются +host_name+ и +provides+:
@ -139,6 +153,25 @@ Thin - это более производительный и функциона
"Sorry, you lost."
end
Для условия, которое принимает несколько параметров, используйте
звездочку:
set(:auth) do |*roles| # <- обратите внимание на звездочку
condition do
unless logged_in? && roles.any? {|role| current_user.in_role? role }
redirect "/login/", 303
end
end
end
get "/my/account/", :auth => [:user, :admin] do
"Your Account Details"
end
get "/only/admin/", :auth => :admin do
"Only admins are allowed here!"
end
=== Возвращаемые значения
Возвращаемое значение блока маршрута ограничивается телом ответа, которое будет передано HTTP клиенту,
@ -148,12 +181,12 @@ Thin - это более производительный и функциона
Вы можете вернуть любой объект, который будет либо корректным Rack ответом, объектом Rack body,
либо кодом состояния HTTP:
* массив с тремя переменными: <tt>[status (Fixnum), headers (Hash), response body (должен отвечать на #each)]</tt>;
* массив с двумя переменными: <tt>[status (Fixnum), response body (должен отвечать на #each)]</tt>;
* массив с тремя переменными: <tt>[код (Fixnum), заголовки (Hash), тело ответа (должно отвечать на #each)]</tt>;
* массив с двумя переменными: <tt>[код (Fixnum), тело ответа (должно отвечать на #each)]</tt>;
* объект, отвечающий на <tt>#each</tt>, который передает только строковые типы данных в этот блок;
* Fixnum, представляющий код состояния HTTP.
Таким образом, мы легко можем создать поточный пример:
Таким образом, легко можно реализовать, например, поточный пример:
class Stream
def each
@ -163,6 +196,9 @@ Thin - это более производительный и функциона
get('/') { Stream.new }
Вы также можете использовать метод +stream+ (описываемый ниже), чтобы
уменьшить количество дублируемого кода и держать логику стриминга прямо в маршруте.
=== Собственные детекторы совпадений для маршрутов
Как показано выше, Sinatra поставляется со встроенной поддержкой строк и
@ -190,7 +226,8 @@ Thin - это более производительный и функциона
# ...
end
Заметьте, что предыдущий пример возможно чересчур сложен, он также может быть представлен как:
Заметьте, что предыдущий пример возможно чересчур усложнен, потому что
он может быть реализован так:
get // do
pass if request.path_info == "/index"
@ -205,8 +242,8 @@ Thin - это более производительный и функциона
== Статические файлы
Статические файлы отдаются из <tt>./public</tt> директории. Вы можете указать другое место,
указав его через опцию <tt>:public_folder</tt>:
Статические файлы отдаются из <tt>./public</tt> директории. Вы можете
указать другое место, используя опцию <tt>:public_folder</tt>:
set :public_folder, File.dirname(__FILE__) + '/static'
@ -229,7 +266,7 @@ Thin - это более производительный и функциона
Отобразит <tt>views/index.erb</tt>.
Вместо имени шаблона вы так же можете передавать непосредственно само
содержимое шаблона
содержимое шаблона:
get '/' do
code = "<%= Time.now %>"
@ -245,7 +282,7 @@ Thin - это более производительный и функциона
Отобразит <tt>views/index.erb</tt>, вложенным в
<tt>views/post.erb</tt> (по умолчанию: <tt>views/layout.erb</tt>, если существует).
Любые опции, не понимаемые Sinatra, будут переданы в шаблонизатор
Любые опции, не понимаемые Sinatra, будут переданы в шаблонизатор:
get '/' do
haml :index, :format => :html5
@ -322,7 +359,7 @@ Thin - это более производительный и функциона
=== Erb шаблоны
Зависимости:: {erubis}[http://www.kuwata-lab.com/erubis/] или erb (включен в Ruby)
Расширения файлов:: <tt>.erb</tt>, <tt>.rhtml</tt> or <tt>.erubis</tt> (только Erubis)
Расширения файлов:: <tt>.erb</tt>, <tt>.rhtml</tt> или <tt>.erubis</tt> (только Erubis)
Пример:: <tt>erb :index</tt>
=== Builder шаблоны
@ -416,7 +453,7 @@ Thin - это более производительный и функциона
Зависимости:: {rdoc}[http://rdoc.rubyforge.org/]
Расширения файлов:: <tt>.rdoc</tt>
Пример:: <tt>textile :README, :layout_engine => :erb</tt>
Пример:: <tt>rdoc :README, :layout_engine => :erb</tt>
В RDoc невозможно вызывать методы или передавать локальные переменные.
Следовательно, вам, скорее всего, придется использовать этот шаблон совместно с
@ -485,6 +522,22 @@ Thin - это более производительный и функциона
Расширения файлов:: <tt>.coffee</tt>
Пример:: <tt>coffee :index</tt>
=== Yajl шаблоны
Зависимости:: {yajl-ruby}[https://github.com/brianmario/yajl-ruby]
Расширения файлов:: <tt>.yajl</tt>
Пример:: <tt>yajl :index, :locals => { :key => 'qux' }, :callback => 'present', :variable => 'resource' </tt>
Содержимое шаблона интерпретируется как код на Ruby, а результирующая переменная json затем
конвертируется с помощью #to_json.
json = { :foo => 'bar' }
json[:baz] = key
Опции <tt>:callback</tt> и <tt>:variable</tt> используются для "декорирования" итогового объекта.
var resource = {"foo":"bar","baz":"qux"}; present(resource);
=== Встроенные шаблоны
get '/' do
@ -529,11 +582,11 @@ Thin - это более производительный и функциона
= yield
@@ index
%div.title Hello world!!!!!
%div.title Hello world.
Заметьте: вложенные шаблоны, определенные в исходном файле, который подключила Sinatra, будут
автоматически загружены. Вызовите <tt>enable :inline_templates</tt> напрямую, если у вас вложенные
шаблоны в других файлах.
загружены автоматически. Вызовите <tt>enable :inline_templates</tt> напрямую, если
используете вложенные шаблоны в других файлах.
=== Именные шаблоны
@ -553,7 +606,7 @@ Thin - это более производительный и функциона
Если шаблон с именем "layout" существует, то он будет использоваться каждый раз
при рендеринге. Вы можете отключать лэйаут в каждом конкретном случае с помощью
<tt>:layout => false</tt> или отключить его для всего приложения, например, так:
<tt>:layout => false</tt> или отключить его для всего приложения:
<tt>set :haml, :layout => false</tt>:
get '/' do
@ -570,7 +623,8 @@ Thin - это более производительный и функциона
=== Добавление собственного движка рендеринга
Сначала зарегистрируйте свой движок в Tilt, затем создайте метод, отвечающий за отрисовку:
Сначала зарегистрируйте свой движок в Tilt, а затем создайте метод,
отвечающий за рендеринг:
Tilt.register :myat, MyAwesomeTemplateEngine
@ -646,6 +700,20 @@ Thin - это более производительный и функциона
bar(params[:name])
end
Также методы-помощники могут быть заданы в отдельных модулях:
module FooUtils
def foo(name) "#{name}foo" end
end
module BarUtils
def bar(name) "#{name}bar" end
end
helpers FooUtils, BarUtils
Эффект равносилен включению модулей в класс приложения.
=== Использование сессий
Сессия используется, чтобы сохранять состояние между запросами. Если эта опция
@ -662,9 +730,9 @@ Thin - это более производительный и функциона
end
Заметьте, что при использовании <tt>enable :sessions</tt> все данные
сохраняются в cookies. Это может быть не совсем то, что вы хотите (например,
сохранение больших объемов данных увеличит ваш трафик). В таком случае вы
можете использовать альтернативную Rack "прослойку" (middleware), реализующую
сохраняются в куках (cookies). Это может быть не совсем то, что вы хотите
(например, сохранение больших объемов данных увеличит ваш трафик). В таком случае
вы можете использовать альтернативную Rack "прослойку" (middleware), реализующую
механизм сессий. Для этого *не надо* вызывать <tt>enable :sessions</tt>,
вместо этого следует подключить ее так же, как и любую другую "прослойку":
@ -788,6 +856,55 @@ Thin - это более производительный и функциона
Как и +body+, методы +headers+ и +status+, вызванные без аргументов, возвращают
свои текущие значения.
=== Стриминг ответов
Иногда требуется начать отправлять данные клиенту прямо в процессе генерирования
частей этих данных. В особых случаях требуется постоянно отправлять данные до тех
пор, пока клиент не закроет соединение. Вы можете использовать метод +stream+
вместо написания собственных "оберток".
get '/' do
stream do |out|
out << "It's gonna be legen -\n"
sleep 0.5
out << " (wait for it) \n"
sleep 1
out << "- dary!\n"
end
end
Что позволяет вам реализовать стриминговые API,
{Server Sent Events}[http://dev.w3.org/html5/eventsource/],
и может служить основой для {WebSockets}[http://en.wikipedia.org/wiki/WebSocket].
Также такой подход можно использовать для увеличения производительности в случае,
когда какая-то часть контента зависит от медленного ресурса.
Заметьте, что возможности стриминга, особенно количество одновременно обслуживаемых
запросов, очень сильно зависят от используемого веб-сервера. Некоторые сервера,
например, WEBRick, могут и вовсе не поддерживать стриминг. Если сервер не
поддерживает стриминг, то все данные будут отправлены за один раз сразу после того,
как блок, переданный в +stream+, завершится. Стриминг вообще не работает при
использовании Shotgun.
Если метод используется с параметром +keep_open+, то он не будет вызывать +close+
у объекта потока, что позволит вам закрыть его позже в любом другом месте. Это
работает только с событийными серверами, например, с Thin и Rainbows.
Другие же сервера все равно будут закрывать поток:
set :server, :thin
connections = []
get '/' do
# держать все потоки открытыми
stream(:keep_open) { |out| connections << out }
end
post '/' do
# написать во все открытые потоки
connections.each { |out| out << params[:message] << "\n" }
"message sent"
end
=== Логирование
В области видимости запроса метод +logger+ предоставляет доступ к экземпляру +Logger+:
@ -806,11 +923,16 @@ Thin - это более производительный и функциона
его вручную:
class MyApp < Sinatra::Base
configure(:production, :development) do
configure :production, :development do
enable :logging
end
end
Чтобы избежать использования любой логирующей "прослойки", задайте опции
+logging+ значение +nil+. Тем не менее, не забывайте, что в такой ситуации
+logger+ вернет +nil+. Чаще всего так делают, когда задают свой собственный
логер. Sinatra будет использовать то, что находится в <tt>env['rack.logger']</tt>.
=== Mime-типы
Когда вы используете <tt>send_file</tt> или статические файлы, у вас могут быть mime-типы, которые Sinatra
@ -904,7 +1026,7 @@ Thin - это более производительный и функциона
end
Чтобы как следует использовать кэширование, вам следует подумать об использовании
+etag+ и +last_modified+. Рекомендуется использовать эти методы-помощники *до*
+etag+ или +last_modified+. Рекомендуется использовать эти методы-помощники *до*
выполнения ресурсоемких вычислений, так как они немедленно отправят ответ клиенту,
если текущая версия уже есть в их кэше:
@ -938,6 +1060,24 @@ Thin - это более производительный и функциона
Используйте опцию <tt>:static_cache_control</tt> (см. ниже), чтобы
добавить заголовок <tt>Cache-Control</tt> к статическим файлам.
В соответствии с RFC 2616 ваше приложение должно вести себя по-разному,
когда заголовки If-Match или If-None-Match имеют значение <tt>*</tt>, в
зависимости от того, существует или нет запрашиваемый ресурс. Sinatra
предполагает, что ресурсы, к которым обращаются с помощью безопасных
(GET) и идемпотентных (PUT) методов, уже существуют, а остальные ресурсы
(к которым обращаются, например, с помощью POST) считает новыми. Вы
можете изменить данное поведение с помощью опции <tt>:new_resource</tt>:
get '/create' do
etag '', :new_resource => true
Article.create
erb :new_article
end
Если вы хотите использовать weak ETag, задайте опцию <tt>:kind</tt>:
etag '', :new_resource => true, :kind => :weak
=== Отправка файлов
Для отправки файлов пользователю вы можете использовать метод <tt>send_file</tt>:
@ -968,6 +1108,9 @@ Thin - это более производительный и функциона
[length]
значения для заголовка Content-Length, по умолчанию: размер файла.
[status]
Код ответа. Полезно, когда отдается статический файл в качестве страницы
с сообщением об ошибке.
Этот метод будет использовать возможности Rack сервера для отправки файлов, если они
доступны, а в противном случае, будет напрямую отдавать файл из Ruby процесса.
@ -1043,6 +1186,37 @@ Thin - это более производительный и функциона
"store it!"
end
=== Работа с временем и датами
Sinatra предлагает метод-помощник +time_for+, который из заданного значения
создает объект Time. Он также может конвертировать +DateTime+, +Date+ и
подобные классы:
get '/' do
pass if Time.now > time_for('Dec 23, 2012')
"still time"
end
Этот метод используется внутри Sinatra методами +expires+, +last_modified+ и им
подобными. Поэтому вы легко можете расширить функционал этих методов,
переопределив +time_for+ в своем приложении:
helpers do
def time_for(value)
case value
when :yesterday then Time.now - 24*60*60
when :tomorrow then Time.now + 24*60*60
else super
end
end
end
get '/' do
last_modified :yesterday
expires :tomorrow
"hello"
end
=== Поиск шаблонов
Для поиска шаблонов и их последующего рендеринга используется метод <tt>find_template</tt>:
@ -1129,6 +1303,24 @@ Thin - это более производительный и функциона
...
end
=== Настройка защиты от атак
Sinatra использует
{Rack::Protection}[https://github.com/rkh/rack-protection#readme] для
защиты приложения от простых атак. Вы можете легко выключить эту
защиту (что даст прирост в производительности):
disable :protection
Чтобы пропустить какой-либо уровень защиты, передайте хеш опций
в параметр +protection+:
set :protection, :except => :path_traversal
Вы также можете отключить сразу несколько уровней защиты:
set :protection, :except => [:path_traversal, :session_hijacking]
=== Доступные настройки
[absolute_redirects] если отключено, то Sinatra будет позволять использование
@ -1150,8 +1342,9 @@ Thin - это более производительный и функциона
settings.add_charsets << "application/foobar"
[app_file] главный файл приложения, используется для определения корневой директории
проекта, директорий с шаблонами и статическими файлами, вложенных шаблонов.
[app_file] путь к главному файлу приложения, используется для нахождения корневой
директории проекта, директорий с шаблонами и статическими файлами,
вложенных шаблонов.
[bind] используемый IP-адрес (по умолчанию: 0.0.0.0). Используется только
встроенным сервером.
@ -1182,14 +1375,19 @@ Thin - это более производительный и функциона
если не задан абсолютный путь. Таким образом, <tt>redirect '/foo'</tt>
будет вести себя как <tt>redirect to('/foo')</tt>. Отключено по умолчанию.
[public_folder] директория, откуда будут раздаваться статические файлы.
[protection] включена или нет защита от атак. Смотрите секцию выше.
[public_folder] путь к директории, откуда будут раздаваться статические файлы.
Используется только, если включена раздача статических файлов
(см. опцию <tt>static</tt> ниже).
[reload_templates] перезагружать или нет шаблоны на каждый запрос.
Включено в режиме разработки.
[root] корневая директория проекта.
[root] путь к корневой директории проекта.
[raise_errors] выбрасывать исключения (будет останавливать приложение).
[raise_errors] выбрасывать исключения (будет останавливать приложение). По умолчанию
включено только в окружении <tt>test</tt>.
[run] если включено, Sinatra будет самостоятельно запускать веб-сервер.
Не включайте, если используете rackup или аналогичные средства.
@ -1201,9 +1399,12 @@ Thin - это более производительный и функциона
встроенного сервера. По умолчанию: ['thin', 'mongrel', 'webrick'],
порядок задает приоритет.
[sessions] включить сессии на основе кук (cookie).
[sessions] включить сессии на основе кук (cookie) на базе
<tt>Rack::Session::Cookie</tt>. Смотрите секцию "Использование сессий"
выше.
[show_exceptions] показывать исключения/стек вызовов (stack trace) в браузере.
По умолчанию включено только в окружении <tt>development</tt>.
[static] должна ли Sinatra осуществлять раздачу статических файлов.
Отключите, когда используете какой-либо веб-сервер для этой цели.
@ -1211,13 +1412,35 @@ Thin - это более производительный и функциона
По умолчанию включено в классических и отключено в модульных
приложениях.
[static_cache_control] Когда Sinatra отдает статические файлы, используйте эту опцию,
[static_cache_control] когда Sinatra отдает статические файлы, используйте эту опцию,
чтобы добавить им заголовок <tt>Cache-Control</tt>. Для этого
используется метод-помощник +cache_control+. По умолчанию отключено.
Используйте массив, когда надо задать несколько значений:
<tt>set :static_cache_control, [:public, :max_age => 300]</tt>
[views] директория с шаблонами.
[threaded] если включено, то Thin будет использовать
<tt>EventMachine.defer</tt> для обработки запросов.
[views] путь к директории с шаблонами.
== Режим, окружение
Есть 3 предопределенных режима, окружения: <tt>"development"</tt>,
<tt>"production"</tt> и <tt>"test"</tt>. Режим может быть
задан через переменную окружения +RACK_ENV+. Значение по умолчанию
— <tt>"development"</tt>. В этом режиме работы, все шаблоны
перезагружаются между запросами. А также задаются специальные
обработчики <tt>not_found</tt> и <tt>error</tt>, чтобы вы могли
увидеть стек вызовов. В окружениях <tt>"production"</tt> и
<tt>"test"</tt> шаблоны по умолчанию кэшируются.
Для запуска приложения в определенном окружении, используйте
ключ <tt>-e</tt>
ruby my_app.rb -e [ENVIRONMENT]
Вы можете использовать предопределенные методы +development?+, +test?+
и +production?, чтобы определить текущее окружение.
== Обработка ошибок
@ -1352,15 +1575,13 @@ Rack распространяется с различными стандартн
== Sinatra::Base — "прослойки", библиотеки и модульные приложения
Описание своего приложения самым простейшим способом (с помощью DSL верхнего уровня,
как в примерах выше) отлично работает для крохотных приложений. Тем не менее,
классический стиль) отлично работает для крохотных приложений. В таких случаях
используется конфигурация, рассчитанная на микро-приложения
(единственный файл приложения, <tt>./public</tt> и <tt>./views</tt> директории,
логирование, страница информации об исключении и т.д.). Тем не менее,
такой метод имеет множество недостатков при создании компонентов, таких как
Rack middleware ("прослоек"), Rails metal, простых библиотек с серверными компонентами,
расширений Sinatra.
DSL верхнего уровня "загрязняет" пространство имен <tt>Object</tt> и подразумевает стиль конфигурации
микро-приложения (например, единый файл приложения, <tt>./public</tt> и
<tt>./views</tt> директории, логирование, страницу деталей об исключениях
и т.д.). И тут на помощь приходит <tt>Sinatra::Base</tt>:
расширений Sinatra. И тут на помощь приходит <tt>Sinatra::Base</tt>:
require 'sinatra/base'
@ -1374,7 +1595,7 @@ DSL верхнего уровня "загрязняет" пространств
end
Методы, доступные <tt>Sinatra::Base</tt> подклассам идентичны тем, что доступны
в DSL верхнего уровня. Большинство приложений верхнего уровня могут быть
приложениям в DSL верхнего уровня. Большинство таких приложений могут быть
конвертированы в <tt>Sinatra::Base</tt> компоненты с помощью двух модификаций:
* Вы должны подключать <tt>sinatra/base</tt> вместо +sinatra+,
@ -1391,16 +1612,10 @@ DSL верхнего уровня "загрязняет" пространств
Если этот стиль подходит вашему приложению, вы не обязаны переписывать его в модульное
приложение.
У классического стиля есть всего два недостатка относительно модульного:
* У вас может быть только одно приложение Sinatra на один Ruby процесс. Если вы планируете
использовать больше, то переключайтесь на модульный стиль.
* Приложения, использующие классический стиль, добавляют методы к Object. Если вы
планируете поставлять свое приложение в виде библиотеки/gem, то переходите
на модульный стиль.
Не существует причин, по которым вы не могли бы смешивать модульный и классический стили.
Основным недостатком классического стиля является тот факт, что у вас может
быть только одно приложение Sinatra на один процесс Ruby. Если вы планируете
использовать больше, переключайтесь на модульный стиль. Вы можете смело
смешивать модульный и классический стили.
Переходя с одного стиля на другой, примите во внимание следующие изменения в настройках:
@ -1633,9 +1848,9 @@ Rack-совместимый сервер приложений.
* привязки верхнего уровня, если вы сделали <tt>require 'sinatra'</tt>;
* объекта, расширенного с помощью <tt>Sinatra::Delegator</tt>.
Посмотрите сами в код: тут
{Sinatra::Delegator примесь}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
будет {включена в глобальное пространство имен}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28].
Посмотрите сами в код: вот
{Sinatra::Delegator примесь}[https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/base.rb#L1609-1633]
{расширяет главный объект}[https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/main.rb#L28-30].
== Командная строка
@ -1659,27 +1874,38 @@ Sinatra приложения могут быть запущены напряму
[ Ruby 1.8.7 ]
1.8.7 полностью поддерживается, тем не менее, если вас ничто не держит на
этой версии, рекомендуем обновиться до 1.9.2 или перейти на JRuby или Rubinius.
Поддержка 1.8.7 не будет прекращена до выхода Sinatra 2.0 и Ruby 2.0,
разве что в случае релиза 1.8.8 (что мало вероятно). Но даже тогда, возможно,
поддержка не будет прекращена. <b>Ruby 1.8.6 больше не поддерживается.</b>
Если вы хотите использовать 1.8.6, откатитесь до Sinatra 1.2, которая будет
получать все исправления ошибок до тех пор, пока не будет выпущена
Sinatra 1.4.0.
[ Ruby 1.9.2 ]
1.9.2 поддерживается и рекомендована к использованию. Заметьте, что Radius и Markaby
пока несовместимы с 1.9.2. Не используйте 1.9.2p0, известно, что эта
версия весьма нестабильна при использовании Sinatra.
1.9.2 полностью поддерживается и рекомендована к использованию. Заметьте,
что Radius и Markaby пока несовместимы с 1.9. Не используйте 1.9.2p0,
известно, что эта версия очень нестабильна при использовании Sinatra.
Эта версия будет поддерживаться по крайней мере до выхода Ruby 1.9.4/2.0,
а поддержка последней версии 1.9 будет осуществляться до тех пор, пока
она поддерживается командой разработчиков Ruby.
[ Ruby 1.9.3 ]
1.9.3 полностью поддерживается. Рекомендуем подождать релиза версии с
большим уровнем патчсета (текущий — p0) перед тем, как использовать ее
в рабочем окружении. Заметьте, что переход на 1.9.3 с ранних версий
сделает недействительными все сессии.
[ Rubinius ]
Rubinius официально поддерживается (Rubinius >= 1.2.3), всё, включая все
языки шаблонов, работает.
Rubinius официально поддерживается (Rubinius >= 1.2.4), всё, включая все
языки шаблонов, работает. Предстоящий релиз 2.0 также поддерживается.
[ JRuby ]
JRuby официально поддерживается (JRuby >= 1.6.1). Нет никаких проблем с
JRuby официально поддерживается (JRuby >= 1.6.5). Нет никаких проблем с
использованием альтернативных шаблонов. Тем не менее, если вы выбираете
JRuby, то, пожалуйста, посмотрите на JRuby Rack-сервера, так как Thin не
поддерживается полностью на JRuby. Поддержка расширений на C в JRuby все
еще экспериментальная, что на данный момент затрагивает только RDiscount и
Redcarpet.
<b>Ruby 1.8.6 больше не поддерживается.</b> Если вы хотите запускать свое
приложение на 1.8.6, откатитесь до Sinatra 1.2, которая будет получать все
исправления ошибок до тех пор, пока не будет выпущена Sinatra 1.4.0
еще экспериментальная, что на данный момент затрагивает только RDiscount,
Redcarpet и RedCloth.
Мы также следим за предстоящими к выходу версиями Ruby.
@ -1687,19 +1913,22 @@ Sinatra приложения могут быть запущены напряму
них запускается Sinatra:
* старые версии JRuby и Rubinius;
* Ruby Enterprise Edition;
* MacRuby, Maglev, IronRuby;
* Ruby 1.9.0 и 1.9.1;
* Ruby 1.8.6 с помощью {backports}[https://github.com/marcandre/backports/#readme].
* Ruby 1.9.0 и 1.9.1 (настоятельно не рекомендуются к использованию).
То, что версия официально не поддерживается, означает, что, если что-то не
работает на этой версии, а на поддерживаемой работает - это не наша проблема, а их.
работает на этой версии, а на поддерживаемой работает это не наша проблема, а их.
Мы также запускаем наши CI-тесты на последней версии Ruby (предстоящей 1.9.3),
но мы не можем ничего гарантировать, так как она постоянно развивается.
Предполагается, что 1.9.3p0 будет поддерживаться.
Мы также запускаем наши CI-тесты на версии Ruby, находящейся в разработке
(предстоящей 2.0.0), и на 1.9.4, но мы не можем ничего гарантировать, так как
они находятся в разработке. Предполагается, что 1.9.4p0 и 2.0.0p0 будут поддерживаться.
Sinatra должна работать на любой операционной системе, в которой есть одна из указанных выше версий Ruby.
Пока невозможно запустить Sinatra на Cardinal, SmallRuby, BlueRuby и на любой
версии Ruby до 1.8.7.
== На острие
Если вы хотите использовать самый последний код Sinatra, не бойтесь запускать
@ -1771,9 +2000,9 @@ SemVerTag.
== Дальнейшее чтение
* {Веб-сайт проекта}[http://www.sinatrarb.com/] - Дополнительная документация,
* {Веб-сайт проекта}[http://www.sinatrarb.com/] Дополнительная документация,
новости и ссылки на другие ресурсы.
* {Участие в проекте}[http://www.sinatrarb.com/contributing] - Обнаружили баг? Нужна помощь? Написали патч?
* {Участие в проекте}[http://www.sinatrarb.com/contributing] Обнаружили баг? Нужна помощь? Написали патч?
* {Слежение за проблемами/ошибками}[http://github.com/sinatra/sinatra/issues]
* {Twitter}[http://twitter.com/sinatra]
* {Группы рассылки}[http://groups.google.com/group/sinatrarb/topics]
@ -1783,3 +2012,4 @@ SemVerTag.
* API документация к {последнему релизу}[http://rubydoc.info/gems/sinatra]
или {текущему HEAD}[http://rubydoc.info/github/sinatra/sinatra] на
http://rubydoc.info
* {Сервер непрерывной интеграции}[http://ci.rkh.im/view/Sinatra/]