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:
commit
80b98a22a8
1 changed files with 314 additions and 84 deletions
398
README.ru.rdoc
398
README.ru.rdoc
|
@ -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/]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue