diff --git a/README.ru.rdoc b/README.ru.rdoc
index 4d81d622..e55c0022 100644
--- a/README.ru.rdoc
+++ b/README.ru.rdoc
@@ -1,7 +1,7 @@
= Sinatra
Внимание: Этот документ является переводом Английской версии и может быть устаревшим
-Sinatra это предметно-ориентированный язык для быстрого создания приложений на Ruby с
+Sinatra — это предметно-ориентированный язык (DSL) для быстрого создания приложений на Ruby с
приложением минимума усилий:
# myapp.rb
@@ -11,17 +11,17 @@ Sinatra это предметно-ориентированный язык для
'Hello world!'
end
-Установите gem и запустите его используя:
+Установите gem и запустите приложение с помощью:
gem install sinatra
ruby -rubygems myapp.rb
Результат будет тут: http://localhost:4567
-== Пути
+== Маршруты
-В Sinatra, путь это HTTP метод на пару с совпадающим шаблоном URL.
-Каждый путь ассоциирован с блоком:
+В Sinatra маршрут — это пара: HTTP метод и шаблон (образец) URL.
+Каждый маршрут ассоциирован с блоком:
get '/' do
.. что-то показать ..
@@ -39,43 +39,43 @@ Sinatra это предметно-ориентированный язык для
.. что-то удалить ..
end
-Пути проверяются по очередности определения. Первый же совпавший с запросом путь и будет вызван.
+Маршруты сверяются с запросом по очередности определения. Первый же совпавший с запросом маршрут и будет вызван.
-Шаблоны путей могут включать в себя параметры доступные в
+Шаблоны маршрутов могут включать в себя параметры доступные в
params xэше:
get '/hello/:name' do
- # совпадает с "GET /hello/foo" и "GET /hello/bar",
+ # соответствует "GET /hello/foo" и "GET /hello/bar",
# где params[:name] 'foo' или 'bar'
"Hello #{params[:name]}!"
end
-Можно также использовать именные параметры с помощью блоков:
+Можно также использовать именные параметры в переменных блоков:
get '/hello/:name' do |n|
"Hello #{n}!"
end
-Шаблоны путей также могут включать splat (или постановочные) параметры доступные
+Шаблоны маршрутов также могут включать splat (wildcard, *, любая строка символов) параметры доступные
в params[:splat] массиве.
get '/say/*/to/*' do
- # совпадает с /say/hello/to/world
+ # соответствует /say/hello/to/world
params[:splat] # => ["hello", "world"]
end
get '/download/*.*' do
- # совпадает с /download/path/to/file.xml
+ # соответствует /download/path/to/file.xml
params[:splat] # => ["path/to/file", "xml"]
end
-Пути также могут совпадать с регулярными выражениями:
+Маршруты также могут использовать регулярные выражение в качестве шаблона URL:
get %r{/hello/([\w]+)} do
"Hello, #{params[:captures].first}!"
end
-Или используя блоки:
+Или с параметром блока:
get %r{/hello/([\w]+)} do |c|
"Hello, #{c}!"
@@ -83,14 +83,14 @@ Sinatra это предметно-ориентированный язык для
=== Условия
-Пути могут включать различные условия совпадений, такие как 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 браузерами
+ # соответствует с non-songbird браузерам
end
Другими доступными условиями являются +host_name+ и +provides+:
@@ -107,7 +107,7 @@ Sinatra это предметно-ориентированный язык для
builder :feed
end
-Довольно легко также описать собственные условия:
+Довольно легко можно задать собственные условия:
set(:probability) { |value| condition { rand <= value } }
@@ -116,22 +116,22 @@ Sinatra это предметно-ориентированный язык для
end
get '/win_a_car' do
- "Sorry, you lost."программн
+ "Sorry, you lost."
end
=== Возвращаемые значения
-Возвращаемое значение блока определяет как минимум тело ответа переданное HTTP клиенту,
-или хотя бы следующему подпрограммному обеспечению из Rack стека.
-Чаще всего это строка, как в выше изложенных примерах. Но другие значения также доступны.
+Возвращаемое значение блока маршрута ограничивается телом ответа, которое будет передано HTTP клиенту,
+или следующей подпрограммой (middleware) в Rack стеке. Чаще всего это строка, как в выше изложенных примерах.
+Но и другие значения также приемлимы.
-Вы можете вернуть любой объект, который должен быть либо действительным Rack ответом, Rack
-объектным телом либо HTTP статус кодом:
+Вы можете вернуть любой объект, который будет либо корректным Rack ответом, Rack
+телом ответа, либо кодом состояния HTTP:
* Массив с тремя переменными: [status (Fixnum), headers (Hash), response body (должен отвечать на #each)]
* Массив с двумя переменными: [status (Fixnum), response body (должен отвечать на #each)]
-* Объект отвечающий на #each который передает только строковые типы данных в этот блок
-* Fixnum соответствующий статус коду
+* Объект, отвечающий на #each, который передает только строковые типы данных в этот блок
+* Fixnum, соответствующий коду состояния HTTP
Таким образом мы легко можем создать поточный пример:
@@ -145,263 +145,263 @@ Sinatra это предметно-ориентированный язык для
== Статические файлы
-Статические файлы поставляются из ./public директории. Вы можете настроить
-на другую локацию использую :public опцию:
+Статические файлы отдаются из ./public директории. Вы можете указать другое место,
+используя :public опцию:
set :public, File.dirname(__FILE__) + '/static'
-Учтите что имя public директории не включено в URL. Например файл
+Учтите, что имя директории со статическими файлами не включено в URL. Например, файл
./public/css/style.css будет доступен как
http://example.com/css/style.css.
== Виды / Шаблоны
-Шаблоны видов по умолчанию будут использованы из директории ./views.
+Шаблоны по умолчанию будут использованы из директории ./views.
Для использования другой директории:
set :views, File.dirname(__FILE__) + '/templates'
-Важно помнить что вы всегда должны указывать шаблоны
-с помощью символов даже если это подкаталог (в этом случае
+Важно помнить, что вы всегда должны указывать шаблоны
+с помощью символов, даже если это подкаталог (в этом случае
успользуйте :'subdir/template'). Вы должны использовать
-символ иначе методы, ответственные за рендеринг, отобразят переданную им строку.
+символ, иначе методы, ответственные за рендеринг, отобразят просто переданную им строку.
=== Haml шаблоны
-Haml gem/библиотека необходима для визуализации HAML шаблонов:
+Haml gem/библиотека необходима для рендеринга HAML шаблонов:
- ## Вам нужно будет затребовать haml gem в приложении
+ ## Вам нужно будет подключить haml gem в приложении
require 'haml'
get '/' do
haml :index
end
-Визуализирует ./views/index.haml.
+Отрисует ./views/index.haml.
-{Опции Haml'а}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
-могут быть установлены глобально через конфигурацию Sinatra'ы,
-посмотрите {Опции и Конфигурации}[http://www.sinatrarb.com/configuration.html],
-и переписаны на индивидуальной основе.
+{Опции Haml}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
+могут быть установлены глобально через конфигурацию Sinatra,
+посмотрите {Опции и Конфигурация}[http://www.sinatrarb.com/configuration.html],
+и переопределены локально.
set :haml, :format => :html5 # :xhtml - Haml формат по умолчанию
get '/' do
- haml :index, :format => :html4 # переписан
+ haml :index, :format => :html4 # переопределен
end
=== Erb шаблоны
- ## Вам нужно будет затребовать erb в приложении
+ ## Вам нужно будет подключить erb в приложении
require 'erb'
get '/' do
erb :index
end
-Визуализирует ./views/index.erb
+Отрисует ./views/index.erb
=== Erubis шаблоны
-Erubis gem/библиотека необходима для визуализации erubis шаблонов:
+Erubis gem/библиотека необходима для рендеринга erubis шаблонов:
- ## Вам нужно будет затребовать erubis в приложении
+ ## Вам нужно будет подключить erubis в приложении
require 'erubis'
get '/' do
erubis :index
end
-Визуализирует ./views/index.erubis
+Отрисует ./views/index.erubis
=== Builder шаблоны
-Builder gem/библиотека необходима для визуализации builder шаблонов:
+Builder gem/библиотека необходима для рендеринга builder шаблонов:
- ## Вам нужно будет затребовать builder в приложении
+ ## Вам нужно будет подключить builder в приложении
require 'builder'
get '/' do
builder :index
end
-Визуализирует ./views/index.builder.
+Отрисует ./views/index.builder.
=== Nokogiri шаблоны
-Nokogiri gem/библиотека необходима для визуализации nokogiri шаблонов:
+Nokogiri gem/библиотека необходима для рендеринга nokogiri шаблонов:
- ## Вам нужно будет затребовать nokogiri в приложении
+ ## Вам нужно будет подключить nokogiri в приложении
require 'nokogiri'
get '/' do
nokogiri :index
end
-Визуализирует ./views/index.nokogiri.
+Отрисует ./views/index.nokogiri.
=== Sass шаблоны
-Haml gem/библиотека необходима для визуализации Sass шаблонов:
+Haml gem/библиотека необходима для рендеринга Sass шаблонов:
- ## Вам нужно будет затребовать haml или sass в приложении
+ ## Вам нужно будет подключить haml или sass в приложении
require 'sass'
get '/stylesheet.css' do
sass :stylesheet
end
-Визуализирует ./views/stylesheet.sass.
+Отрисует ./views/stylesheet.sass.
{Опции Sass}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
-могут быть установлены глобально через конфигурацию Sinatra'ы,
-посмотрите {Опции и Конфигурации}[http://www.sinatrarb.com/configuration.html],
-и переписаны на индивидуальной основе.
+могут быть установлены глобально через конфигурацию Sinatra,
+посмотрите {Опции и Конфигурация}[http://www.sinatrarb.com/configuration.html],
+и переопределены локально.
set :sass, :style => :compact # :nested - стиль Sass по умолчанию
get '/stylesheet.css' do
- sass :stylesheet, :style => :expanded # переписан
+ sass :stylesheet, :style => :expanded # переопределен
end
=== Scss шаблоны
-Haml gem/библиотека необходима для визуализации Scss шаблонов:
+Haml gem/библиотека необходима для рендеринга Scss шаблонов:
- ## Вам нужно будет затребовать haml или sass в приложении
+ ## Вам нужно будет подключить haml или sass в приложении
require 'sass'
get '/stylesheet.css' do
scss :stylesheet
end
-Визуализирует ./views/stylesheet.scss.
+Отрисует ./views/stylesheet.scss.
{Опции Scss}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
-могут быть установлены глобально через конфигурацию Sinatra'ы,
-посмотрите {Опции и Конфигурации}[http://www.sinatrarb.com/configuration.html],
-и переписаны на индивидуальной основе.
+могут быть установлены глобально через конфигурацию Sinatra,
+посмотрите {Опции и Конфигурация}[http://www.sinatrarb.com/configuration.html],
+и переопределены локально.
set :scss, :style => :compact # :nested - стиль Scss по умолчанию
get '/stylesheet.css' do
- scss :stylesheet, :style => :expanded # переписан
+ scss :stylesheet, :style => :expanded # переопределен
end
=== Less шаблоны
-less gem/библиотека необходима для визуализации Less шаблонов:
+less gem/библиотека необходима для рендеринга Less шаблонов:
- ## Вам нужно будет затребовать less в приложении
+ ## Вам нужно будет подключить less в приложении
require 'less'
get '/stylesheet.css' do
less :stylesheet
end
-Визуализирует ./views/stylesheet.less.
+Отрисует ./views/stylesheet.less.
=== Liquid шаблоны
-liquid gem/библиотека необходима для визуализации liquid шаблонов:
+liquid gem/библиотека необходима для рендеринга liquid шаблонов:
- ## Вам нужно будет затребовать liquid в приложении
+ ## Вам нужно будет подключить liquid в приложении
require 'liquid'
get '/' do
liquid :index
end
-Визуализирует ./views/index.liquid.
+Отрисует ./views/index.liquid.
-Так как в Liquid шаблоне невозможно вызывать методы из Ruby (кроме +yield+),
+Так как в Liquid шаблонах невозможно вызывать методы из Ruby (кроме +yield+),
то вы почти всегда будете передавать локальные переменные:
liquid :index, :locals => { :key => 'value' }
=== Markdown шаблоны
-rdiscount gem/библиотека необходима для визуализации Markdown шаблонов:
+rdiscount gem/библиотека необходима для рендеринга Markdown шаблонов:
- ## Вам нужно будет затребовать rdiscount в приложении
+ ## Вам нужно будет подключить rdiscount в приложении
require "rdiscount"
get '/' do
markdown :index
end
-Визуализирует ./views/index.markdown (+md+ и +mkd+ являются также допустимыми файловыми
+Отрисует ./views/index.markdown (+md+ и +mkd+ также являются допустимыми файловыми
расширениями).
В markdown невозможно вызывать методы или передавать локальные переменные. Следовательно вам скорее всего прийдется
-использовать этот шаблон совместно с другим рендер движком:
+использовать этот шаблон совместно с другим движком рендеринга:
erb :overview, :locals => { :text => markdown(:introduction) }
-Заметьте что в можете вызывать метод markdown из других шаблонов:
+Заметьте, что вы можете вызывать метод markdown из других шаблонов:
%h1 Hello From Haml!
%p= markdown(:greetings)
=== Textile шаблоны
-RedCloth gem/библиотека необходима для визуализации Textile шаблонов:
+RedCloth gem/библиотека необходима для рендеринга Textile шаблонов:
- ## Вам нужно будет затребовать redcloth в приложении
+ ## Вам нужно будет подключить redcloth в приложении
require "redcloth"
get '/' do
textile :index
end
-Визуализирует ./views/index.textile.
+Отрисует ./views/index.textile.
В textile невозможно вызывать методы или передавать локальные переменные. Следовательно вам скорее всего прийдется
-использовать этот шаблон совместно с другим рендер движком:
+использовать этот шаблон совместно с другим движком рендеринга:
erb :overview, :locals => { :text => textile(:introduction) }
-Заметьте что в можете вызывать метод textile из других шаблонов:
+Заметьте, что вы можете вызывать метод textile из других шаблонов:
%h1 Hello From Haml!
%p= textile(:greetings)
=== RDoc шаблоны
-RDoc gem/библиотека необходима для визуализации RDoc шаблонов:
+RDoc gem/библиотека необходима для рендеринга RDoc шаблонов:
- ## Вам нужно будет затребовать rdoc в приложении
+ ## Вам нужно будет подключить rdoc в приложении
require "rdoc"
get '/' do
rdoc :index
end
-Визуализирует ./views/index.rdoc.
+Отрисует ./views/index.rdoc.
В rdoc невозможно вызывать методы или передавать локальные переменные. Следовательно вам скорее всего прийдется
-использовать этот шаблон совместно с другим рендер движком:
+использовать этот шаблон совместно с другим движком рендеринга:
erb :overview, :locals => { :text => rdoc(:introduction) }
-Заметьте что в можете вызывать метод rdoc из других шаблонов:
+Заметьте, что вы можете вызывать метод rdoc из других шаблонов:
%h1 Hello From Haml!
%p= rdoc(:greetings)
=== Radius шаблоны
-radius gem/библиотека необходима для визуализации Radius шаблонов:
+radius gem/библиотека необходима для рендеринга Radius шаблонов:
- ## Вам нужно будет затребовать radius в приложении
+ ## Вам нужно будет подключить radius в приложении
require 'radius'
get '/' do
radius :index
end
-Визуализирует ./views/index.radius.
+Отрисует ./views/index.radius.
Так как в Radius шаблоне невозможно вызывать методы из Ruby (кроме +yield+),
то вы почти всегда будете передавать локальные переменные:
@@ -410,29 +410,29 @@ radius gem/библиотека необходима для визуализац
=== Markaby шаблоны
-markaby gem/библиотека необходима для визуализации Markaby шаблонов:
+markaby gem/библиотека необходима для рендеринга Markaby шаблонов:
- ## Вам нужно будет затребовать markaby в приложении
+ ## Вам нужно будет подключить markaby в приложении
require 'markaby'
get '/' do
markaby :index
end
-Визуализирует ./views/index.mab.
+Отрисует ./views/index.mab.
=== CoffeeScript шаблоны
-coffee-script gem/библиотека и `coffee` бинарный файл необходимы для визуализации CoffeeScript шаблонов:
+coffee-script gem/библиотека и `coffee` бинарный файл необходимы для рендеринга CoffeeScript шаблонов:
- ## Вам нужно будет затребовать coffee-script в приложении
+ ## Вам нужно будет подключить coffee-script в приложении
require 'coffee-script'
get '/application.js' do
coffee :application
end
-Визуализирует ./views/application.coffee.
+Отрисует ./views/application.coffee.
=== Внутристроковые шаблоны
@@ -440,30 +440,30 @@ coffee-script gem/библиотека и `coffee` бинарный файл н
haml '%div.title Hello World'
end
-Визуализирует стороковые переменные.
+Отрисует внутристроковый шаблон.
=== Доступ к переменным в шаблонах
-Шаблоны определяются/интерпретируются в том же контексте что и обработчики путей. Переменные
-установленные в процесе обработки путей будут доступны напрямую в шаблоне:
+Шаблоны интерпретируются в том же контексте, что и обработчики маршрутов. Переменные экзмепляра,
+установленные в процесе обработки маршрутов, будут доступны напрямую в шаблонах:
get '/:id' do
@foo = Foo.find(params[:id])
haml '%h1= @foo.name'
end
-Либо через хеш локальных переменных:
+Либо установите их через хеш локальных переменных:
get '/:id' do
foo = Foo.find(params[:id])
haml '%h1= foo.name', :locals => { :foo => foo }
end
-Это обычно используется когда шаблоны рендерятся как частные из других шаблонов.
+Это обычно используется когда шаблоны рендерятся как частные (partials) из других шаблонов.
-=== Внутристроковые шаблоны
+=== Вложенные шаблоны
-Шаблоны так же могут быть определены в конце файла-исходника:
+Шаблоны также могут быть определены в конце файла-исходника:
require 'sinatra'
@@ -480,13 +480,13 @@ coffee-script gem/библиотека и `coffee` бинарный файл н
@@ index
%div.title Hello world!!!!!
-Заметьте: Внутристроковые шаблоны определенные в файле-исходнике которые затребовал sinatra будут
-автоматически загружены. Вызовите enable :inline_templates напрямую если у вас внутристроковые
+Заметьте: Вложенные шаблоны, определенные в файле-исходнике, который подключил sinatra, будут
+автоматически загружены. Вызовите enable :inline_templates напрямую, если у вас вложенные
шаблоны в других файлах.
=== Именные шаблоны
-Шаблоны так же могут быть определены используя template метод:
+Шаблоны также могут быть определены используя template метод:
template :layout do
"%html\n =yield\n"
@@ -500,8 +500,8 @@ coffee-script gem/библиотека и `coffee` бинарный файл н
haml :index
end
-Если шаблон с именем "layout" существует, то он будет использован каждый раз
-когда любой шаблон будет визуализирован. Вы можете отключить layout-макет с помощью :layout => false.
+Если шаблон с именем "layout" существует, то он будет использован каждый раз,
+когда шаблоны будут отрисовываться. Вы можете отключить layout-шаблон с помощью :layout => false.
get '/' do
haml :index, :layout => !request.xhr?
@@ -510,7 +510,7 @@ coffee-script gem/библиотека и `coffee` бинарный файл н
== Методы помощники
Используйте helpers метод для определения методов помощников для дальнейшего
-использования в обработчиках путей и шаблонах:
+использования в обработчиках маршрутов и шаблонах:
helpers do
def bar(name)
@@ -524,8 +524,8 @@ coffee-script gem/библиотека и `coffee` бинарный файл н
== Фильтры
-Before-фильтры будут определены/интерпретированы перед каждым запросом с тем же контекстом что и пути и фильтры могут изменять
-как запрос там и ответ на него. Переменные установленные в фильтрах доспутны в путях и шаблонах:
+Before-фильтры выполняются перед каждым запросом в том же контексте, что и маршруты. Фильтры могут изменять
+как запрос, так и ответ на него. Переменные экземпляра, установленные в фильтрах, доступны в маршрутах и шаблонах:
before do
@note = 'Hi!'
@@ -537,14 +537,14 @@ Before-фильтры будут определены/интерпретиров
params[:splat] #=> 'bar/baz'
end
-After-фильтры будут определены/интерпретированы после каждого запроса с тем же контекстом что и пути и фильтры могут изменять
-как запрос там и ответ на него. Переменные установленные в before-фильтрах и путях будут доступны в after-фильтрах:
+After-фильтры выполняются после каждого запроса в том же контексте, что и пути. Фильтры могут изменять
+как запрос, так и ответ на него. Переменные экземпляра, установленные в before-фильтрах и маршрутах, будут доступны в after-фильтрах:
after do
puts response.status
end
-Фильтры могут принимать схемы/шаблоны и будут интерпретированы только если путь запроса совпадает с этим шаблоном:
+Фильтры могут использовать шаблоны URL и будут интерпретированы только, если путь запроса совпадет с этим шаблоном:
before '/protected/*' do
authenticate!
@@ -556,7 +556,7 @@ After-фильтры будут определены/интерпретиров
== Прерывание
-Для того чтобы незамедлительно прервать запрос внутри фильтра либо пути используйте:
+Чтобы незамедлительно прервать обработку запроса внутри фильтра или маршрута используйте:
halt
@@ -564,11 +564,11 @@ After-фильтры будут определены/интерпретиров
halt 410
-Либо тело:
+Тело:
halt 'this will be the body'
-Либо и то, и другое:
+И то, и другое:
halt 401, 'go away!'
@@ -578,7 +578,7 @@ After-фильтры будут определены/интерпретиров
== Передача
-Путь может передать процесс следующему совпадающему пути используя pass:
+Маршрут может передать обработку запроса следующему совпадающему маршруту, используя pass:
get '/guess/:who' do
pass unless params[:who] == 'Frank'
@@ -589,16 +589,17 @@ After-фильтры будут определены/интерпретиров
'You missed!'
end
-Блок пути сказу же закончен и контроль переходить к следующему совпадающему пути. Если совпадающий путь не найден то ответом
-на запрос будет 404.
+Блок маршрута сразу же прерывается, и контроль переходит к следующему совпадающему маршруту.
+Если соответствующий маршрут не найден, то ответом на запрос будет 404.
== Доспут к объекту запроса
-Входящий объект запроса может быть доступен в уровне запроса (в фильтрах, путях, обработчиках ошибок) используя `request` метод:
+Объект входящего запроса доступен на уровне обработки запроса (в фильтрах, маршрутах, обработчиках ошибок)
+с помощью `request` метода:
# приложение запущено на http://example.com/example
get '/foo' do
- request.body # тело запроса посланное клиентом (см ниже)
+ request.body # тело запроса, посланное клиентом (см. ниже)
request.scheme # "http"
request.script_name # "/example"
request.path_info # "/foo"
@@ -608,7 +609,7 @@ After-фильтры будут определены/интерпретиров
request.content_length # длина тела запроса
request.media_type # медиа тип тела запроса
request.host # "example.com"
- request.get? # true (для других участвующих глаголах есть похожие методы)
+ request.get? # true (для других участвующих HTTP глаголов есть похожие методы)
request.form_data? # false
request["SOME_HEADER"] # значение SOME_HEADER заголовка
request.referer # источник запроса клиента либо '/'
@@ -619,7 +620,7 @@ After-фильтры будут определены/интерпретиров
request.path # "/example/foo"
request.ip # IP адрес клиента
request.secure? # false
- request.env # env хеш как получено Rack-ом
+ request.env # env хеш как получено Rack
end
Некоторые опции, такие как script_name или path_info могут быть переписаны:
@@ -630,31 +631,30 @@ After-фильтры будут определены/интерпретиров
"all requests end up here"
end
-request.body является IO либо StringIO объектом:
+request.body является IO или StringIO объектом:
post "/api" do
- request.body.rewind # в случаи если кто то уже прочитал тело запроса
+ request.body.rewind # в случае, если кто-то уже прочитал тело запроса
data = JSON.parse request.body.read
"Hello #{data['name']}!"
end
== Конфигурация
-Будет запущено про загрузке в любом из сред:
+Этот блок исполняется один раз при старте в любом окружении, режиме (environment):
configure do
...
end
-Будет запущено когда среда (RACK_ENV переменная) установлена на
+Будет запущено, когда окружение (RACK_ENV переменная) установлена в
:production:
configure :production do
...
end
-Будет запущено когда среда на :production или на
-:test:
+Будет запущено, когда окружение :production или :test:
configure :production, :test do
...
@@ -662,22 +662,22 @@ After-фильтры будут определены/интерпретиров
== Обработка ошибок
-Обработчики ошибок будут запущены с тем же контекстом что и пути и before-фильтры, что означаем что всякие
-прелести какие как haml, erb, halt и т.д. будут доступны.
+Обработчики ошибок исполняются в том же контексте, что и маршруты, before-фильтры, а это означает, что всякие
+прелести вроде haml, erb, halt и т.д. доступны и им.
-=== Исключение NotFound
+=== NotFound
-Когда Sinatra::NotFound исключение было вызвано или когда статусом ответа является 404,
-то not_found будет вызван:
+Когда возбуждено исключение Sinatra::NotFound, или кодом ответа является 404,
+то будет вызван not_found обработчик:
not_found do
'This is nowhere to be found.'
end
-=== Ошибка
+=== Ошибки
-Обработчик ошибок +error+ будет призван когда исключение вызвано из блока пути либо из фильтра.
-Объект-исключение будут основан на sinatra.error переменной Rack-а:
+Обработчик ошибок +error+ будет вызван, когда исключение возбуждено из блока маршрута, либо из фильтра.
+Объект-исключение доступен как переменная sinatra.error в Rack:
error do
'Sorry there was a nasty error - ' + env['sinatra.error'].name
@@ -699,7 +699,7 @@ After-фильтры будут определены/интерпретиров
So what happened was... something bad
-Помимо вы можете установить обработчик ошибок для статус кода:
+Также вы можете установить обработчик ошибок для кода состояния HTTP:
error 403 do
'Access forbidden'
@@ -715,30 +715,29 @@ After-фильтры будут определены/интерпретиров
'Boom'
end
-Sinatra устанавливает специальные not_found и error обработчики когда является
-запущенной в среде разработки.
+Sinatra устанавливает специальные not_found и error обработчики, когда запущена в режиме
+разработки (окружение :development).
== Mime типы
-Когда используете send_file либо статические файлы мы можете использовать mime типы которые Sinatra
-не понимает по умолчанию. Используйте +mime_type+ для их регистрации по файловому расширению:
+Когда используете send_file или статические файлы, у вас могут быть mime типы которые Sinatra,
+не понимает по умолчанию. Используйте +mime_type+ для их регистрации по расширению файла:
mime_type :foo, 'text/foo'
-Вы также можете использовать +content_type+ помощник:
+Вы также можете использовать это в +content_type+ помощнике:
content_type :foo
-== Rack подпрограммное обеспечение
+== Rack подпрограммы
Sinatra использует Rack[http://rack.rubyforge.org/], минимальный стандартный
-интерфейс для Ruby веб систем. Одна из самых интересных способностей Rack'а
-является возможность поддержки подпрограммного обеспечения-"middleware" -- компоненты
-сидящие между сервером и вашем приложении которые наблюдают и/или манипулируют
-HTTP запросы/ответы для предоставления различных типов общей функциональности.
+интерфейс для веб-фреймворков на Ruby. Одной из самых интересных для разработчиков возможностей Rack
+является поддержка подпрограмм ("middleware") -- компонентов,
+"сидящих" между сервером и вашим приложением, которые отслеживают и/или манипулируют
+HTTP запросами/ответами для предоставления различной функциональности.
-Sinatra позволяет создание подпрограммного обеспечения Rack пустяком используя метод
-вверхнего уровня +use+:
+В Sinatra очень просто использовать такие Rack подпрограммы с помощью метода +use+:
require 'sinatra'
require 'my_custom_middleware'
@@ -750,7 +749,7 @@ Sinatra позволяет создание подпрограммного об
'Hello World'
end
-Семантика +use+ идентичная той что определена для
+Семантика +use+ идентична той, что определена для
Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] DSL
(чаще всего используется в rackup файлах). Например, +use+ метод принимает
множественные переменные, также как и блоки:
@@ -759,15 +758,15 @@ Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] DSL
username == 'admin' && password == 'secret'
end
-Rack распространяется с различным стандартным подпрограммным обеспечением
-для логирования, дебагинга, URL пути следования, аудентикации и обработки сессий. Sinatra использует
-многие из этих компонентов автоматически основываясь на конфигурации чтобы вам не проходилось
-регистрировать/использовать +use+ их вручную.
+Rack распространяется с различными стандартными подпрограммами
+для логирования, дебагинга, маршрутизации URL, аутентификации, обработки сессий. Sinatra использует
+многие из этих компонентов автоматически, основываясь на конфигурации, чтобы вам не проходилось
+регистрировать/использовать (+use+) их вручную.
== Тестирование
-Sinatra тесты могут быть написаны на любой из библиотек либо систем поддерживающих
-Rack тестирование. {Rack::Test}[http://gitrdoc.com/brynary/rack-test] рекомендован:
+Тесты для Sinatra приложений могут быть написаны с помощью библиотек, фреймворков, поддерживающих
+тестирование Rack. {Rack::Test}[http://gitrdoc.com/brynary/rack-test] рекомендован:
require 'my_sinatra_app'
require 'test/unit'
@@ -799,17 +798,17 @@ Rack тестирование. {Rack::Test}[http://gitrdoc.com/brynary/rack-test
Заметьте: Встроенные модули Sinatra::Test и Sinatra::TestHarness являются
устаревшими начиная с 0.9.2 релиза.
-== Sinatra::Base - Подпрограммное обеспечение, библиотеки и модульные приложения
+== Sinatra::Base - Подпрограммы, библиотеки и модульные приложения
-Определяя свое приложение как приложение вверхнего уровня работает
-отлично что микро приложений, но имеет множество недостатков когда надо
-создать используемые компоненты такие как Rack
-middleware, Rails metal, простые библиотеки с серверными компонентами либо
-Sinatra разрешениями. Предметно-ориентированный язык вверхнего уровня
-загрязняет пространство имен объекта и подразумевает стиль конфигурации
-микро приложения (например: единый файл приложения, ./public и
+Описание своего приложения самым простейшим способом (с помощью DSL верхнего уровня, как в примерах выше)
+работает отлично для крохотных приложений, но имеет множество недостатков, когда надо
+создать компоненты такие как Rack
+middleware, Rails metal, простые библиотеки с серверными компонентами,
+Sinatra расширения.
+DSL верхнего уровня загрязняет пространство имен Object и подразумевает стиль конфигурации
+микро приложения (например, единый файл приложения, ./public и
./views директории, создание логов, страницу деталей об исключениях
-и т.д.). В такой случае идеально использование Sinatra::Base:
+и т.д.). И тут на помощь приходит Sinatra::Base:
require 'sinatra/base'
@@ -822,32 +821,30 @@ Sinatra разрешениями. Предметно-ориентированн
end
end
-MyApp класс является независимым Rack компонентом который может исполнять роли
-Rack подпрограммного обеспечения, Rack приложения, либо Rails metal. Вы можете +use+(использовать) либо
-+run+(запустить) этот класс из rackup +config.ru+ конфиругационного файла; или, контролировать компонент
-сервера созданного библиотекой:
+MyApp класс является независимым Rack компонентом, который может исполнять роли
+Rack подпрограммы, Rack приложения, Rails metal. Вы можете +use+ (использовать) или
++run+ (запустить) этот класс из rackup файла +config.ru+; или контролировать серверную
+часть из библиотеки:
MyApp.run! :host => 'localhost', :port => 9090
-Методы доступные Sinatra::Base сабклассам являются идентичными тем, что доступны
-в предметно-ориентированном языке вверхнего уровня. Большинство приложений вверхнего уровня могут быть
+Методы доступные Sinatra::Base сабклассам идентичны тем, что доступны
+в DSL верхнего уровня. Большинство приложений верхнего уровня могут быть
конвертированы в Sinatra::Base компоненты с помощью двух модификаций:
-* Все файлы должны запрашивать +sinatra/base+ вместо +sinatra+;
- иначе, все методы предоставляемые Sinatra'ой будут импортированные в
- главное пространство имен.
-* Все блоки путей, обработчики ошибок, фильтры и опции должны быть в
- Sinatra::Base сабклассе.
+* Вы должны подключать +sinatra/base+ вместо +sinatra+;
+ иначе, все методы предоставляемые Sinatra будут импортированные в глобальное пространство имен.
+* Поместите все маршруты, обработчики ошибок, фильтры и опции в сабкласс Sinatra::Base.
-Sinatra::Base это чистый лист. Большинство опций, включая встроенный сервер, по умолчанию отключены.
-Смотрите {Опции и Конфигурации}[http://www.sinatrarb.com/configuration.html] для детальной информации
-об опциях и их поведения.
+Sinatra::Base — это чистый лист. Большинство опций, включая встроенный сервер, по умолчанию отключены.
+Смотрите {Опции и Конфигурация}[http://www.sinatrarb.com/configuration.html] для детальной информации
+об опциях и их поведении.
-=== Использование Sinatra как подпрограммное обеспечение
+=== Использование Sinatra как подпрограммы
-Не только Sinatra сама может использовать другое подпрограммное обеспечение Rack, так и любое Sinatra приложение
-само может быть добавлено к любому Rack эндпоинту в качестве подпрограммного обеспечения. Этим эндпоинтом
-может быть другое Sinatra приложение либо приложение основанное на Rack (Rails/Ramaze/Camping/...).
+Не только сама Sinatra может использовать подпрограммы Rack, любое Sinatra приложение
+само может быть добавлено к любому Rack эндпоинту в качестве подпрограммы. Этим эндпоинтом
+может быть другое Sinatra приложение или приложение, основанное на Rack (Rails/Ramaze/Camping/...).
require 'sinatra/base'
@@ -866,7 +863,7 @@ Rack подпрограммного обеспечения, Rack приложе
end
class MyApp < Sinatra::Base
- # подпрограммное обеспечение будет запущено перед фильтрами
+ # подпрограмма будет запущена перед фильтрами
use LoginScreen
before do
@@ -878,22 +875,22 @@ Rack подпрограммного обеспечения, Rack приложе
get('/') { "Hello #{session['user_name']}." }
end
-== Область видимости и привязка
+== Области видимости и привязка
-Текучая область видимости определяет методы и переменные доступные
+Текущая область видимости определяет методы и переменные доступные
в данный момент.
=== Область видимости приложения / класса
Любое Sinatra приложение соответствует сабклассу Sinatra::Base. Если вы
-используете предметно-ориентированный язык вверхнего
+используете DSL верхнего
уровня (require 'sinatra'), то этим классом будет
-Sinatra::Application, иначе это будет сабкласс которые вы создали вручную.
-На уровне класса вам будут доступны методы как `get` или `before`, но вы
-не сможете иметь доступ с объекту `request` или `session`, так как существует
-только единый application класс для всех запросов.
+Sinatra::Application, иначе это будет сабкласс, который вы создали вручную.
+На уровне класса вам будут доступны такие методы, как `get` или `before`, но вы
+не сможете иметь доступ к объектам `request` или `session`, так как существует
+только единый класс приложения для всех запросов.
-Опции созданные используя `set` являются методами на уровне класса:
+Опции, созданные с помощью `set`, являются методами уровня класса:
class MyApp << Sinatra::Base
# Я в области видимости приложения!
@@ -907,23 +904,23 @@ Sinatra::Application, иначе это будет сабкласс которы
У вас будет область видимости приложения внутри:
-* Тела вашего application класса
-* Методов определенных расширениями
-* Блока переданного в `helpers`
-* Блоках использованных как значения для `set`
+* Тела вашего класса приложения
+* Методов, определенных расширениями
+* Блока, переданного в `helpers`
+* Блоков, использованных как значения для `set`
-Вы можете достать объект области видимости (класс) через:
+Вы можете получить доступ к объекту области видимости (классу приложения) следующими способами:
-* объект переданный блокам конфигурации (configure { |c| ... })
+* объект, переданный блокам конфигурации (configure { |c| ... })
* `settings` внутри области видимости запроса
=== Область видимости запроса/экземпляра
-Для каждого входящего запроса новый экземпляр вашего класса приложения будет
-создан и все блоки обработчика будут запущены в этом контексте. В этой области
-видимости вам доступны `request` и `session` объекты или вызовы методов
-визуализации такие как `erb` или `haml`. Вы можете получить доступ к
-области видимости приложения из контекста запроса используя `settings` помощник:
+Для каждого входящего запроса будет создан новый экземпляр вашего приложения,
+и все блоки обработчика будут запущены в этом контексте. В этой области
+видимости вам доступны `request` и `session` объекты, вызовы методов
+рендеринга такие как `erb` или `haml`. Вы можете получить доступ к
+области видимости приложения из контекста запроса используя помощник `settings`:
class MyApp << Sinatra::Base
# Я в области видимости приложения!
@@ -947,24 +944,24 @@ Sinatra::Application, иначе это будет сабкласс которы
* методах помощниках
* шаблонах/видах
-=== Контекст делегирования
+=== Область видимости делегирования
-Область видимости делегирования просто переправляет методы в контекст класса.
+Область видимости делегирования просто переправляет методы в область видимости класса.
Однако, оно не полностью на 100% ведет себя как область видимости класса,
-так как у вас нету привязи к классу: только методы помеченные для
-делегирования будут доступны и переменные/состояние области видимости класса
-не будут поделены (иначе говоря: у вас будет другой `self` объект). Вы можете
-непосредственно добавить методы делегирования вызывая
+так как у вас нету привязки к классу: только методы, явно помеченные для
+делегирования, будут доступны, а переменных/состояний области видимости класса
+не будет (иначе говоря: у вас будет другой `self` объект). Вы можете
+непосредственно добавить методы делегирования, используя
Sinatra::Delegator.delegate :method_name.
У вас будет контекст делегирования внутри:
-* Привязь вверхнего уровня, если вы запросили require "sinatra"
-* Объекта расширенного с помощью `Sinatra::Delegator` примеси
+* Привязки верхнего уровня, если вы сделали require "sinatra"
+* Объекта, расширенного с помощью примеси `Sinatra::Delegator`
-Посмотрите на непосредствено сам код: тут
+Посмотрите сами в код: тут
{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].
+будет {включена в глобальное пространство имен}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28].
== Командная строка
@@ -977,13 +974,13 @@ Sinatra приложения могут быть запущены напряму
-h # помощь
-p # настроить порт (по умолчанию 4567)
-o # настроить хост (по умолчанию 0.0.0.0)
- -e # настроить среду (по умолчанию development)
+ -e # настроить окружение, режим (по умолчанию development)
-s # настроить rack сервер/обработчик (по умолчанию thin)
- -x # включить семафор взаимного исключения (по умолчанию выключено)
+ -x # включить мьютекс (по умолчанию выключен)
-== The Bleeding Edge (Новейший и потенциально нестабильный код)
+== На острие
-Если вы хотите использовать новейший код Sinatra'ы, то создайте локальный
+Если вы хотите использовать новейший код Sinatra, то создайте локальный
клон и запускайте свое приложение с sinatra/lib директорией
в LOAD_PATH:
@@ -991,7 +988,7 @@ Sinatra приложения могут быть запущены напряму
git clone git://github.com/sinatra/sinatra.git
ruby -Isinatra/lib myapp.rb
-Альтернативно вы можете добавить sinatra/lib директорию в
+Также вы можете добавить sinatra/lib директорию в
LOAD_PATH приложения:
$LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
@@ -1002,7 +999,7 @@ Sinatra приложения могут быть запущены напряму
"I'm running version " + Sinatra::VERSION
end
-Чтобы обновить исходники Sinatra'ы:
+Чтобы обновить исходники Sinatra:
cd myproject/sinatra
git pull
@@ -1011,8 +1008,7 @@ Sinatra приложения могут быть запущены напряму
* {Вебсайт проекта}[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]