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]