Remove unnecessary whitespaces

This commit is contained in:
Seiichi Yonezawa 2015-09-21 01:50:57 +09:00
parent 1d48ab2929
commit d66cfcc451
10 changed files with 1015 additions and 1015 deletions

View File

@ -227,7 +227,7 @@ end
Routen können auch den query-Parameter verwenden:
``` ruby
```ruby
get '/posts' do
# matches "GET /posts?title=foo&author=bar"
title = params['title']
@ -527,7 +527,7 @@ Rendering-Methoden rendern jeden String direkt.
### Direkte Templates
``` ruby
```ruby
get '/' do
haml '%div.title Hallo Welt'
end
@ -969,14 +969,14 @@ Da man aus dem Mediawiki-Template heraus keine Ruby-Methoden aufrufen und auch
keine locals verwenden kann, wird man Mediawiki üblicherweise in Kombination mit
anderen Renderern verwenden wollen:
``` ruby
```ruby
erb :overview, :locals => { :text => mediawiki(:introduction) }
```
Beachte: Man kann die `mediawiki`-Methode auch aus anderen Templates
heraus aufrufen:
``` ruby
```ruby
%h1 Grüße von Haml!
%p= mediawiki(:greetings)
```
@ -1031,7 +1031,7 @@ Templates zu verwenden und einen anderen für das Layout, indem die
Um Stylus-Templates ausführen zu können, müssen `stylus` und `stylus/tilt`
zuerst geladen werden:
``` ruby
```ruby
require 'sinatra'
require 'stylus'
require 'stylus/tilt'
@ -1068,7 +1068,7 @@ end
Die Template-Quelle wird als Ruby-String evaluiert. Die daraus resultierende
json Variable wird mit Hilfe von `#to_json` umgewandelt:
``` ruby
```ruby
json = { :foo => 'bar' }
json[:baz] = key
```
@ -1076,7 +1076,7 @@ json[:baz] = key
Die `:callback` und `:variable` Optionen können mit dem gerenderten Objekt
verwendet werden:
``` javascript
```javascript
var resource = {"foo":"bar","baz":"qux"};
present(resource);
```
@ -1134,7 +1134,7 @@ Ein Layout ist üblicherweise ein Template, das ein `yield` aufruft. Ein solches
Template kann entweder wie oben beschrieben über die `:template` Option
verwendet werden oder mit einem Block gerendert werden:
``` ruby
```ruby
erb :post, :layout => false do
erb :index
end
@ -1145,7 +1145,7 @@ Dieser Code entspricht weitestgehend `erb :index, :layout => :post`.
Blöcke an Render-Methoden weiterzugeben ist besonders bei verschachtelten
Layouts hilfreich:
``` ruby
```ruby
erb :main_layout, :layout => false do
erb :admin_layout do
erb :user
@ -1155,7 +1155,7 @@ end
Der gleiche Effekt kann auch mit weniger Code erreicht werden:
``` ruby
```ruby
erb :admin_layout, :layout => :main_layout do
erb :user
end
@ -1257,7 +1257,7 @@ Tilt zu erfahren.
Um einen eigenen Mechanismus zum Aufsuchen von Templates zu
implementieren, muss `#find_template` definiert werden:
``` ruby
```ruby
configure do
set :views [ './views/a', './views/b' ]
end
@ -1395,7 +1395,7 @@ set :sessions, :domain => 'foo.com'
Um eine Session mit anderen Apps und zwischen verschiedenen Subdomains
von foo.com zu teilen, wird ein *.* der Domain vorangestellt:
``` ruby
```ruby
set :sessions, :domain => '.foo,com'
```
@ -2469,7 +2469,7 @@ Details über mögliche Optionen.
Damit eine App sich ähnlich wie eine klassische App verhält, kann man
auch eine Subclass von `Sinatra::Application` erstellen:
``` ruby
```ruby
require 'sinatra/base'
class MyApp < Sinatra::Application

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

292
README.md

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,7 @@ Alguns dos trechos de código a seguir utilizam caracteres UTF-8. Então, caso e
Sinatra é uma [DSL](http://pt.wikipedia.org/wiki/Linguagem_de_domínio_específico) para
criar aplicações web em Ruby com o mínimo de esforço e rapidez:
``` ruby
```ruby
# minha_app.rb
require 'sinatra'
@ -23,13 +23,13 @@ end
Instale a gem:
``` shell
```shell
gem install sinatra
```
Em seguida execute:
``` shell
```shell
ruby minha_app.rb
```
@ -102,7 +102,7 @@ Sinatra irá utilizá-la.
No Sinatra, uma rota é um método HTTP emparelhado com um padrão de URL.
Cada rota possui um bloco de execução:
``` ruby
```ruby
get '/' do
.. mostrando alguma coisa ..
end
@ -134,7 +134,7 @@ rota encontrada responde a requisição.
Padrões de rota podem conter parâmetros nomeados, acessíveis por meio do
hash `params`:
``` ruby
```ruby
get '/ola/:nome' do
# corresponde a "GET /ola/foo" e "GET /ola/bar"
# params['nome'] é 'foo' ou 'bar'
@ -145,7 +145,7 @@ end
Você também pode acessar parâmetros nomeados por meio dos parâmetros de
um bloco:
``` ruby
```ruby
get '/ola/:nome' do |n|
# corresponde a "GET /ola/foo" e "GET /ola/bar"
# params['nome'] é 'foo' ou 'bar'
@ -157,7 +157,7 @@ end
Padrões de rota também podem conter parâmetros splat (curinga),
acessível por meio do array `params['splat']`:
``` ruby
```ruby
get '/diga/*/para/*' do
# corresponde a /diga/ola/para/mundo
params['splat'] # => ["ola", "mundo"]
@ -171,7 +171,7 @@ end
Ou com parâmetros de um bloco:
``` ruby
```ruby
get '/download/*.*' do |caminho, ext|
[caminho, ext] # => ["caminho/do/arquivo", "xml"]
end
@ -179,7 +179,7 @@ end
Rotas podem casar com expressões regulares:
``` ruby
```ruby
get /\A\/ola\/([\w]+)\z/ do
"Olá, #{params['captures'].first}!"
end
@ -187,7 +187,7 @@ end
Ou com parâmetros de um bloco:
``` ruby
```ruby
get %r{/ola/([\w]+)} do |c|
# corresponde a "GET /meta/ola/mundo", "GET /ola/mundo/1234" etc.
"Olá, #{c}!"
@ -196,7 +196,7 @@ end
Padrões de rota podem contar com parâmetros opcionais:
``` ruby
```ruby
get '/posts.?:formato?' do
# corresponde a "GET /posts" e qualquer extensão "GET /posts.json", "GET /posts.xml", etc.
end
@ -204,7 +204,7 @@ end
Rotas também podem utilizar query strings:
``` ruby
```ruby
get '/posts' do
# corresponde a "GET /posts?titulo=foo&autor=bar"
titulo = params['titulo']
@ -221,7 +221,7 @@ comparação com as suas rotas.
Rotas podem incluir uma variedade de condições, tal como o `user agent`:
``` ruby
```ruby
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
"Você está usando o Songbird versão #{params['agent'][0]}"
end
@ -233,7 +233,7 @@ end
Outras condições disponíveis são `host_name` e `provides`:
``` ruby
```ruby
get '/', :host_name => /^admin\./ do
"Área administrativa. Acesso negado!"
end
@ -250,7 +250,7 @@ end
Você pode facilmente definir suas próprias condições:
``` ruby
```ruby
set(:probabilidade) { |valor| condition { rand <= valor } }
get '/ganha_um_carro', :probabilidade => 0.1 do
@ -264,7 +264,7 @@ end
Use splat, para uma condição que leva vários valores:
``` ruby
```ruby
set(:auth) do |*roles| # <- observe o splat aqui
condition do
unless logged_in? && roles.any? {|role| current_user.in_role? role }
@ -306,7 +306,7 @@ retornar um código de status HTTP.
Dessa forma, podemos implementar facilmente um exemplo de streaming:
``` ruby
```ruby
class Stream
def each
100.times { |i| yield "#{i}\n" }
@ -326,7 +326,7 @@ embutido para uso de padrões de String e expressões regulares como
validadores de rota. No entanto, ele não pára por aí. Você pode
facilmente definir os seus próprios validadores:
``` ruby
```ruby
class AllButPattern
Match = Struct.new(:captures)
@ -352,7 +352,7 @@ end
Note que o exemplo acima pode ser robusto e complicado em excesso. Pode
também ser implementado como:
``` ruby
```ruby
get // do
pass if request.path_info == "/index"
# ...
@ -361,7 +361,7 @@ end
Ou, usando algo mais denso à frente:
``` ruby
```ruby
get %r{^(?!/index$)} do
# ...
end
@ -373,7 +373,7 @@ Arquivos estáticos são disponibilizados a partir do diretório
`./public`. Você pode especificar um local diferente pela opção
`:public_folder`
``` ruby
```ruby
set :public_folder, File.dirname(__FILE__) + '/estatico'
```
@ -385,7 +385,7 @@ Note que o nome do diretório público não é incluido na URL. Um arquivo
Cada linguagem de template é exposta através de seu próprio método de renderização. Estes metodos simplesmente retornam uma string:
``` ruby
```ruby
get '/' do
erb :index
end
@ -404,7 +404,7 @@ end
Templates também aceitam um segundo argumento, um hash de opções:
``` ruby
```ruby
get '/' do
erb :index, :layout => :post
end
@ -414,7 +414,7 @@ Isto irá renderizar a `views/index.erb` inclusa dentro da `views/post.erb` (o p
Qualquer opção não reconhecida pelo Sinatra será passada adiante para o engine de template:
``` ruby
```ruby
get '/' do
haml :index, :format => :html5
end
@ -422,7 +422,7 @@ end
Você também pode definir opções padrões para um tipo de template:
``` ruby
```ruby
set :haml, :format => :html5
get '/' do
@ -477,7 +477,7 @@ Opções disponíveis:
<dd>
A engine de template utilizada para renderizar seu layout.
Útil para linguagens que não suportam templates de outra
forma. O padrão é a engine do template utilizado. Exemplo:
forma. O padrão é a engine do template utilizado. Exemplo:
<tt>set :rdoc, :layout_engine => :erb</tt>
</dd>
@ -498,14 +498,14 @@ set :views, settings.root + '/templates'
Uma coisa importante para se lembrar é que você sempre deve
referenciar os templates utilizando *symbols*, mesmo que
eles estejam em um subdiretório (neste caso use:
`:'subdir/template'` or `'subdir/template'.to_sym`). Você deve
`:'subdir/template'` or `'subdir/template'.to_sym`). Você deve
utilizar um *symbol* porque senão o método de renderização irá
renderizar qualquer outra string que você passe diretamente
para ele
### Literal Templates
``` ruby
```ruby
get '/' do
haml '%div.title Olá Mundo'
end
@ -517,7 +517,7 @@ Renderiza um template string.
Algumas linguagens possuem multiplas implementações. Para especificar qual implementação deverá ser utilizada (e para ser *thread-safe*), você deve simplesmente requere-la primeiro:
``` ruby
```ruby
require 'rdiscount' # ou require 'bluecloth'
get('/') { markdown :index }
```
@ -696,20 +696,20 @@ você quase sempre precisará passar o `locals` para ele.
Não é possível chamar métodos por este template, nem passar *locals* para o mesmo. Portanto normalmente é utilizado junto a outra engine de renderização:
``` ruby
```ruby
erb :overview, :locals => { :text => markdown(:introducao) }
```
Note que vcoê também pode chamar o método `markdown` dentro de outros templates:
``` ruby
```ruby
%h1 Olá do Haml!
%p= markdown(:saudacoes)
```
Já que você não pode chamar o Ruby pelo Markdown, você não
pode utilizar um layout escrito em Markdown. Contudo é
possível utilizar outra engine de renderização como template,
possível utilizar outra engine de renderização como template,
deve-se passar a `:layout_engine` como opção.
<table>
@ -729,20 +729,20 @@ deve-se passar a `:layout_engine` como opção.
Não é possível chamar métodos por este template, nem passar *locals* para o mesmo. Portanto normalmente é utilizado junto a outra engine de renderização:
``` ruby
```ruby
erb :overview, :locals => { :text => textile(:introducao) }
```
Note que vcoê também pode chamar o método `textile` dentro de outros templates:
``` ruby
```ruby
%h1 Olá do Haml!
%p= textile(:saudacoes)
```
Já que você não pode chamar o Ruby pelo Textile, você não
pode utilizar um layout escrito em Textile. Contudo é
possível utilizar outra engine de renderização como template,
possível utilizar outra engine de renderização como template,
deve-se passar a `:layout_engine` como opção.
#### RDoc Templates
@ -764,20 +764,20 @@ deve-se passar a `:layout_engine` como opção.
Não é possível chamar métodos por este template, nem passar *locals* para o mesmo. Portanto normalmente é utilizado junto a outra engine de renderização:
``` ruby
```ruby
erb :overview, :locals => { :text => rdoc(:introducao) }
```
Note que vcoê também pode chamar o método `rdoc` dentro de outros templates:
``` ruby
```ruby
%h1 Olá do Haml!
%p= rdoc(:saudacoes)
```
Já que você não pode chamar o Ruby pelo RDoc, você não
pode utilizar um layout escrito em RDoc. Contudo é
possível utilizar outra engine de renderização como template,
possível utilizar outra engine de renderização como template,
deve-se passar a `:layout_engine` como opção.
#### AsciiDoc Templates
@ -892,20 +892,20 @@ Este também recebe um bloco para templates (veja o exemplo).
Não é possível chamar métodos por este template, nem passar *locals* para o mesmo. Portanto normalmente é utilizado junto a outra engine de renderização:
``` ruby
```ruby
erb :overview, :locals => { :text => creole(:introduction) }
```
Note que vcoê também pode chamar o método `creole` dentro de outros templates:
``` ruby
```ruby
%h1 Olá do Haml!
%p= creole(:saudacoes)
```
Já que você não pode chamar o Ruby pelo Creole, você não
pode utilizar um layout escrito em Creole. Contudo é
possível utilizar outra engine de renderização como template,
possível utilizar outra engine de renderização como template,
deve-se passar a `:layout_engine` como opção.
#### MediaWiki Templates
@ -929,20 +929,20 @@ It is not possible to call methods from MediaWiki markup, nor to pass locals to
it. You therefore will usually use it in combination with another rendering
engine:
``` ruby
```ruby
erb :overview, :locals => { :text => mediawiki(:introduction) }
```
Note that you may also call the `mediawiki` method from within other templates:
``` ruby
```ruby
%h1 Hello From Haml!
%p= mediawiki(:greetings)
```
Já que você não pode chamar o Ruby pelo MediaWiki, você não
pode utilizar um layout escrito em MediaWiki. Contudo é
possível utilizar outra engine de renderização como template,
possível utilizar outra engine de renderização como template,
deve-se passar a `:layout_engine` como opção.
#### CoffeeScript Templates
@ -995,7 +995,7 @@ deve-se passar a `:layout_engine` como opção.
Antes que vcoê possa utilizar o template Stylus primeiro você deve carregar `stylus` e `stylus/tilt`:
``` ruby
```ruby
require 'sinatra'
require 'stylus'
require 'stylus/tilt'
@ -1031,14 +1031,14 @@ end
O código-fonte do template é executado como uma string Ruby e a variável resultante em json é convertida utilizando `#to_json`:
``` ruby
```ruby
json = { :foo => 'bar' }
json[:baz] = key
```
O `:callback` e `:variable` são opções que podem ser utilizadas para o objeto de renderização:
``` javascript
```javascript
var resource = {"foo":"bar","baz":"qux"};
present(resource);
```
@ -1070,7 +1070,7 @@ Templates são avaliados dentro do mesmo contexto como manipuladores de
rota. Variáveis de instância setadas em rotas manipuladas são
diretamente acessadas por templates:
``` ruby
```ruby
get '/:id' do
@foo = Foo.find(params['id'])
haml '%h1= @foo.nome'
@ -1079,7 +1079,7 @@ end
Ou, especifique um hash explícito para variáveis locais:
``` ruby
```ruby
get '/:id' do
foo = Foo.find(params['id'])
haml '%h1= foo.nome', :locals => { :foo => foo }
@ -1091,10 +1091,10 @@ partials dentro de outros templates.
### Templates com `yield` e layouts aninhados
O layout geralmente é apenas um template que executa `yield`.
O layout geralmente é apenas um template que executa `yield`.
Tal template pode ser utilizado pela opção `:template` descrita acima ou pode ser renderizado através de um bloco, como a seguir:
``` ruby
```ruby
erb :post, :layout => false do
erb :index
end
@ -1104,7 +1104,7 @@ Este código é quase equivalente a `erb :index, :layout => :post`
Passando blocos para os métodos de renderização é útil para criar layouts aninhados:
``` ruby
```ruby
erb :main_layout, :layout => false do
erb :admin_layout do
erb :user
@ -1114,7 +1114,7 @@ end
Também pode ser feito com menos linhas de código:
``` ruby
```ruby
erb :admin_layout, :layout => :main_layout do
erb :user
end
@ -1127,7 +1127,7 @@ Atualmente os métodos listados aceitam blocos: `erb`, `haml`,
Templates podem ser definidos no final do arquivo fonte(.rb):
``` ruby
```ruby
require 'sinatra'
get '/' do
@ -1153,7 +1153,7 @@ tem templates inline no outro arquivo fonte.
Templates também podem ser definidos utilizando o método top-level
`template`:
``` ruby
```ruby
template :layout do
"%html\n =yield\n"
end
@ -1171,7 +1171,7 @@ Se existir um template com nome “layout”, ele será utilizado toda vez
que um template for renderizado. Você pode desabilitar layouts passando
`:layout => false`.
``` ruby
```ruby
get '/' do
haml :index, :layout => !request.xhr?
end
@ -1181,7 +1181,7 @@ end
Para associar uma extensão de arquivo com um engine de template use o método `Tilt.register`. Por exemplo, se você quiser usar a extensão `tt` para os templates Textile você pode fazer o seguinte:
``` ruby
```ruby
Tilt.register :tt, Tilt[:textile]
```
@ -1189,7 +1189,7 @@ Tilt.register :tt, Tilt[:textile]
Primeiro registre seu engine utilizando o Tilt, e então crie um método de renderização:
``` ruby
```ruby
Tilt.register :myat, MyAwesomeTemplateEngine
helpers do
@ -1208,7 +1208,7 @@ https://github.com/rtomayko/tilt para saber mais sobre Tilt.
Para implementar sua própria lógica para busca de templates você pode escrever seu próprio método `#find_template`
``` ruby
```ruby
configure do
set :views [ './views/a', './views/b' ]
end
@ -1227,7 +1227,7 @@ da requisição e podem modificar a requisição e a reposta. Variáveis de
instância setadas nos filtros são acessadas através de rotas e
templates:
``` ruby
```ruby
before do
@nota = 'Oi!'
request.path_info = '/foo/bar/baz'
@ -1244,7 +1244,7 @@ requisição e também podem modificar a requisição e a resposta. Variáveis d
instância e rotas definidas nos filtros before são acessadas através dos
filtros after:
``` ruby
```ruby
after do
puts response.status
end
@ -1253,7 +1253,7 @@ end
Filtros opcionalmente têm um padrão, fazendo com que sejam avaliados
somente se o caminho do pedido coincidir com esse padrão:
``` ruby
```ruby
before '/protected/*' do
authenticate!
end
@ -1268,7 +1268,7 @@ end
Use o método de alto nível `helpers` para definir métodos auxiliares
para utilizar em manipuladores de rotas e modelos:
``` ruby
```ruby
helpers do
def bar(nome)
"#{nome}bar"
@ -1284,7 +1284,7 @@ end
Sessões são usadas para manter um estado durante uma requisição. Se ativa, você terá disponível um hash de sessão para cada sessão de usuário:
``` ruby
```ruby
enable :sessions
get '/' do
@ -1298,7 +1298,7 @@ end
Note que `enable :sessions` utilizará um cookie para guardar todos os dados da sessão. Isso nem sempre pode ser o que você quer (guardar muitos dados irá aumentar o seu tráfego, por exemplo). Você pode utilizar qualquer Rack middleware de sessão: para fazer isso **não** utilize o método `enable :sessions`, ao invés disso utilize seu middleware de sessão como utilizaria qualquer outro:
``` ruby
```ruby
use Rack::Session::Pool, :expire_after => 2592000
get '/' do
@ -1312,19 +1312,19 @@ end
Para melhorar a segurança, os dados da sessão guardados no cookie é assinado com uma chave secreta da sessão. Uma chave aleatória é gerada para você pelo Sinatra. Contudo, já que a chave mudará cada vez que você inicia sua aplicação, você talvez queira defini-la você mesmo para que todas as instâncias da aplicação compartilhe-a:
``` ruby
```ruby
set :session_secret, 'super secret'
```
Se você quiser fazer outras configurações, você também pode guardar um hash com as opções nas configurações da `session`:
``` ruby
```ruby
set :sessions, :domain => 'foo.com'
```
Para compartilhar sua sessão entre outros aplicativos em um subdomínio de foo.com, utilize o prefixo *.*:
``` ruby
```ruby
set :sessions, :domain => '.foo.com'
```
@ -1332,37 +1332,37 @@ set :sessions, :domain => '.foo.com'
Para parar imediatamente uma requisição com um filtro ou rota utilize:
``` ruby
```ruby
halt
```
Você também pode especificar o status quando parar…
``` ruby
```ruby
halt 410
```
Ou com corpo de texto…
``` ruby
```ruby
halt 'isso será o corpo do texto'
```
Ou também…
``` ruby
```ruby
halt 401, 'vamos embora!'
```
Com cabeçalhos…
``` ruby
```ruby
halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
```
É obviamente possivel combinar um template com o `halt`:
``` ruby
```ruby
halt erb(:error)
```
@ -1371,7 +1371,7 @@ halt erb(:error)
Uma rota pode processar aposta para a próxima rota correspondente usando
`pass`:
``` ruby
```ruby
get '/adivinhar/:quem' do
pass unless params['quem'] == 'Frank'
'Você me pegou!'
@ -1390,7 +1390,7 @@ próxima rota de parâmetro. Se o parâmetro da rota não for encontrado, um
As vezes o `pass` não é o que você quer, ao invés dele talvez você queira obter o resultado chamando outra rota. Utilize o método `call` neste caso:
``` ruby
```ruby
get '/foo' do
status, headers, body = call env.merge("PATH_INFO" => '/bar')
[status, headers, body.map(&:upcase)]
@ -1411,7 +1411,7 @@ Veja a especificação do Rack se você quer aprender mais sobre o `call`.
Rodando uma vez, na inicialização, em qualquer ambiente:
``` ruby
```ruby
configure do
...
end
@ -1420,7 +1420,7 @@ end
Rodando somente quando o ambiente (`RACK_ENV` environment variável) é
setado para `:production`:
``` ruby
```ruby
configure :production do
...
end
@ -1428,7 +1428,7 @@ end
Rodando quando o ambiente é setado para `:production` ou `:test`:
``` ruby
```ruby
configure :production, :test do
...
end
@ -1445,7 +1445,7 @@ oferecer, como `haml`, `erb`, `halt`, etc.
Quando um `Sinatra::NotFound` exception é levantado, ou o código de
status da reposta é 404, o manipulador `not_found` é invocado:
``` ruby
```ruby
not_found do
'Isto está longe de ser encontrado'
end
@ -1457,7 +1457,7 @@ O manipulador `error` é invocado toda a vez que uma exceção é lançada a
partir de um bloco de rota ou um filtro. O objeto da exceção pode ser
obtido a partir da variável Rack `sinatra.error`:
``` ruby
```ruby
error do
'Desculpe, houve um erro desagradável - ' + env['sinatra.error'].message
end
@ -1465,7 +1465,7 @@ end
Erros customizados:
``` ruby
```ruby
error MeuErroCustomizado do
'Então que aconteceu foi...' + env['sinatra.error'].message
end
@ -1473,7 +1473,7 @@ end
Então, se isso acontecer:
``` ruby
```ruby
get '/' do
raise MeuErroCustomizado, 'alguma coisa ruim'
end
@ -1486,7 +1486,7 @@ Você receberá isso:
Alternativamente, você pode instalar manipulador de erro para um código
de status:
``` ruby
```ruby
error 403 do
'Accesso negado'
end
@ -1498,7 +1498,7 @@ end
Ou um range:
``` ruby
```ruby
error 400..510 do
'Boom'
end
@ -1513,13 +1513,13 @@ Quando utilizamos `send_file` ou arquivos estáticos você pode ter mime
types Sinatra não entendidos. Use `mime_type` para registrar eles por
extensão de arquivos:
``` ruby
```ruby
mime_type :foo, 'text/foo'
```
Você também pode utilizar isto com o helper `content_type`:
``` ruby
```ruby
content_type :foo
```
@ -1535,7 +1535,7 @@ vários tipos de funcionalidades comuns.
O Sinatra faz construtores pipelines do middleware Rack facilmente em um
nível superior utilizando o método `use`:
``` ruby
```ruby
require 'sinatra'
require 'meu_middleware_customizado'
@ -1552,7 +1552,7 @@ A semântica de `use` é idêntica aquela definida para a DSL
(mais frequentemente utilizada para arquivos rackup). Por exemplo, o
método `use` aceita múltiplos argumentos/variáveis bem como blocos:
``` ruby
```ruby
use Rack::Auth::Basic do |usuario, senha|
usuario == 'admin' && senha == 'secreto'
end
@ -1569,7 +1569,7 @@ Testes no Sinatra podem ser escritos utilizando qualquer biblioteca ou
framework de teste baseados no Rack.
[Rack::Test](http://gitrdoc.com/brynary/rack-test) é recomendado:
``` ruby
```ruby
require 'minha_aplicacao_sinatra'
require 'rack/test'
@ -1611,7 +1611,7 @@ estilo de configuração de micro aplicativos (exemplo: uma simples
arquivo de aplicação, diretórios `./public` e `./views`, logs, página de
detalhes de exceção, etc.). É onde o `Sinatra::Base` entra em jogo:
``` ruby
```ruby
require 'sinatra/base'
class MinhaApp < Sinatra::Base
@ -1629,7 +1629,7 @@ um middleware Rack, uma aplicação Rack, ou metal Rails. Você pode
utilizar ou executar esta classe com um arquivo rackup `config.ru`;
ou, controlar um componente de servidor fornecendo como biblioteca:
``` ruby
```ruby
MinhaApp.run! :host => 'localhost', :port => 9090
```
@ -1664,7 +1664,7 @@ principal](http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854
Aplicações Sinatra podem ser executadas diretamente:
``` shell
```shell
ruby minhaapp.rb [-h] [-x] [-e AMBIENTE] [-p PORTA] [-o HOST] [-s SERVIDOR]
```
@ -1690,7 +1690,7 @@ significaria que ao iniciar o servidor, você teria que espeficiar o método de
para o Rack handler específico. Os seguintes exemplos é uma demonstração de como iniciar um
servidor Thin multi-thread:
``` ruby
```ruby
# app.rb
require 'sinatra/base'
@ -1706,7 +1706,7 @@ App.run!
Para iniciar o servidor seria:
``` shell
```shell
thin --threaded start
```
@ -1718,7 +1718,7 @@ Se você gostaria de utilizar o código da última versão do Sinatra, crie
um clone local e execute sua aplicação com o diretório `sinatra/lib` no
`LOAD_PATH`:
``` shell
```shell
cd minhaapp
git clone git://github.com/sinatra/sinatra.git
ruby -I sinatra/lib minhaapp.rb
@ -1727,7 +1727,7 @@ ruby -I sinatra/lib minhaapp.rb
Alternativamente, você pode adicionar o diretório do `sinatra/lib` no
`LOAD_PATH` do seu aplicativo:
``` ruby
```ruby
$LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
require 'rubygems'
require 'sinatra'
@ -1739,7 +1739,7 @@ end
Para atualizar o código do Sinatra no futuro:
``` shell
```shell
cd meuprojeto/sinatra
git pull
```

View File

@ -7,7 +7,7 @@ Sinatra é uma
[DSL](http://pt.wikipedia.org/wiki/Linguagem_de_domínio_específico) para
criar rapidamente aplicações web em Ruby com o mínimo de esforço:
``` ruby
```ruby
# minhaapp.rb
require 'rubygems'
require 'sinatra'
@ -18,7 +18,7 @@ end
Instale a gem e execute com:
``` shell
```shell
sudo gem install sinatra
ruby minhaapp.rb
```
@ -30,7 +30,7 @@ Aceda em: [localhost:4567](http://localhost:4567)
No Sinatra, uma rota é um metodo HTTP associado a uma URL correspondente
padrão. Cada rota é associada a um bloco:
``` ruby
```ruby
get '/' do
.. mostrar algo ..
end
@ -54,7 +54,7 @@ Rotas são encontradas na ordem em que são definidas. A primeira rota que
Padrões de rota podem incluir parâmetros nomeados, acessíveis através da
hash `params`:
``` ruby
```ruby
get '/ola/:nome' do
# corresponde a "GET /ola/foo" e "GET /ola/bar"
# params['nome'] é 'foo' ou 'bar'
@ -64,7 +64,7 @@ end
Pode também aceder a parâmetros nomeados através do bloco de parâmetros:
``` ruby
```ruby
get '/ola/:nome' do |n|
"Olá #{n}!"
end
@ -73,7 +73,7 @@ end
Padrões de rota podem também incluir parâmetros splat (asteriscos),
acessíveis através do array `params['splat']`.
``` ruby
```ruby
get '/diga/*/ao/*' do
# corresponde a /diga/ola/ao/mundo
params['splat'] # => ["ola", "mundo"]
@ -87,7 +87,7 @@ end
Rotas correspondem-se com expressões regulares:
``` ruby
```ruby
get /\A\/ola\/([\w]+)\z/ do
"Olá, #{params['captures'].first}!"
end
@ -95,7 +95,7 @@ end
Ou com um bloco de parâmetro:
``` ruby
```ruby
get %r{/ola/([\w]+)} do |c|
"Olá, #{c}!"
end
@ -104,7 +104,7 @@ end
Rotas podem incluir uma variedade de condições correspondentes, por
exemplo, o agente usuário:
``` ruby
```ruby
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
"Você está a utilizar a versão #{params['agent'][0]} do Songbird."
end
@ -120,7 +120,7 @@ Arquivos estáticos são disponibilizados a partir do directório
`./public`. Você pode especificar um local diferente através da opção
`:public_folder`
``` ruby
```ruby
set :public_folder, File.dirname(__FILE__) + '/estatico'
```
@ -133,7 +133,7 @@ Note que o nome do directório público não é incluido no URL. Um arquivo
Templates presumem-se estar localizados sob o directório `./views`. Para
utilizar um directório de views diferente:
``` ruby
```ruby
set :views, File.dirname(__FILE__) + '/modelo'
```
@ -146,7 +146,7 @@ processar qualquer string passada directamente para elas.
A gem/biblioteca haml é necessária para renderizar templates HAML:
``` ruby
```ruby
# É necessário requerir 'haml' na aplicação.
require 'haml'
@ -164,7 +164,7 @@ veja [Opções e
Configurações](http://www.sinatrarb.com/configuration.html), e substitua
em uma requisição individual.
``` ruby
```ruby
set :haml, {:format => :html5 } # o formato padrão do Haml é :xhtml
get '/' do
@ -174,7 +174,7 @@ end
### Erb Templates
``` ruby
```ruby
# É necessário requerir 'erb' na aplicação.
require 'erb'
@ -189,7 +189,7 @@ Renderiza `./views/index.erb`
A gem/biblioteca erubis é necessária para renderizar templates erubis:
``` ruby
```ruby
# É necessário requerir 'erubis' na aplicação.
require 'erubis'
@ -204,7 +204,7 @@ Renderiza `./views/index.erubis`
A gem/biblioteca builder é necessária para renderizar templates builder:
``` ruby
```ruby
# É necessário requerir 'builder' na aplicação.
require 'builder'
@ -220,7 +220,7 @@ Renderiza `./views/index.builder`.
A gem/biblioteca sass é necessária para renderizar templates sass:
``` ruby
```ruby
# É necessário requerir 'haml' ou 'sass' na aplicação.
require 'sass'
@ -239,7 +239,7 @@ veja [Opções e
Configurações](http://www.sinatrarb.com/configuration.html), e substitua
em uma requisição individual.
``` ruby
```ruby
set :sass, {:style => :compact } # o estilo padrão do Sass é :nested
get '/stylesheet.css' do
@ -252,7 +252,7 @@ end
A gem/biblioteca less é necessária para renderizar templates Less:
``` ruby
```ruby
# É necessário requerir 'less' na aplicação.
require 'less'
@ -266,7 +266,7 @@ Renderiza `./views/stylesheet.less`.
### Templates Inline
``` ruby
```ruby
get '/' do
haml '%div.title Olá Mundo'
end
@ -280,7 +280,7 @@ Templates são avaliados dentro do mesmo contexto que os manipuladores de
rota. Variáveis de instância definidas em rotas manipuladas são
directamente acedidas por templates:
``` ruby
```ruby
get '/:id' do
@foo = Foo.find(params['id'])
haml '%h1= @foo.nome'
@ -289,7 +289,7 @@ end
Ou, especifique um hash explícito para variáveis locais:
``` ruby
```ruby
get '/:id' do
foo = Foo.find(params['id'])
haml '%h1= foo.nome', :locals => { :foo => foo }
@ -303,7 +303,7 @@ Isso é tipicamente utilizado quando renderizamos templates parciais
Templates podem ser definidos no final do arquivo fonte(.rb):
``` ruby
```ruby
require 'rubygems'
require 'sinatra'
@ -330,7 +330,7 @@ templates inline no outro arquivo fonte.
Templates também podem ser definidos utilizando o método top-level
`template`:
``` ruby
```ruby
template :layout do
"%html\n =yield\n"
end
@ -348,7 +348,7 @@ Se existir um template com nome “layout”, ele será utilizado sempre que
um template for renderizado. Pode desactivar layouts usando
`:layout => false`.
``` ruby
```ruby
get '/' do
haml :index, :layout => !request.xhr?
end
@ -359,7 +359,7 @@ end
Use o método de alto nível `helpers` para definir métodos auxiliares
para utilizar em manipuladores de rotas e modelos:
``` ruby
```ruby
helpers do
def bar(nome)
"#{nome}bar"
@ -378,7 +378,7 @@ da requisição e podem modificar a requisição e a reposta. Variáveis de
instância definidas nos filtros são acedidas através de rotas e
templates:
``` ruby
```ruby
before do
@nota = 'Olá!'
request.path_info = '/foo/bar/baz'
@ -395,7 +395,7 @@ requisição e também podem modificar o pedido e a resposta. Variáveis de
instância definidas nos filtros before e rotas são acedidas através dos
filtros after:
``` ruby
```ruby
after do
puts response.status
end
@ -404,7 +404,7 @@ end
Filtros opcionalmente têm um padrão, fazendo com que sejam avaliados
somente se o caminho do pedido coincidir com esse padrão:
``` ruby
```ruby
before '/protected/*' do
autenticar!
end
@ -419,31 +419,31 @@ end
Para parar imediatamente uma requisição dentro de um filtro ou rota
utilize:
``` ruby
```ruby
halt
```
Pode também especificar o status ao parar…
``` ruby
```ruby
halt 410
```
Ou com um corpo de texto…
``` ruby
```ruby
halt 'isto será o corpo de texto'
```
Ou também…
``` ruby
```ruby
halt 401, 'vamos embora!'
```
Com cabeçalhos…
``` ruby
```ruby
halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
```
@ -452,7 +452,7 @@ halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
Dentro de uma rota, pode passar para a próxima rota correspondente
usando `pass`:
``` ruby
```ruby
get '/adivinhar/:quem' do
pass unless params['quem'] == 'Frank'
'Apanhaste-me!'
@ -471,7 +471,7 @@ próxima rota de parâmetro. Se o parâmetro da rota não for encontrado, um
Correndo uma vez, na inicialização, em qualquer ambiente:
``` ruby
```ruby
configure do
...
end
@ -480,7 +480,7 @@ end
Correndo somente quando o ambiente (`RACK_ENV` environment variável) é
definido para `:production`:
``` ruby
```ruby
configure :production do
...
end
@ -488,7 +488,7 @@ end
Correndo quando o ambiente é definido para `:production` ou `:test`:
``` ruby
```ruby
configure :production, :test do
...
end
@ -504,7 +504,7 @@ signifca que `haml`, `erb`, etc, estão disponíveis.
Quando um `Sinatra::NotFound` exception é levantado, ou o código de
status da reposta é 404, o manipulador `not_found` é invocado:
``` ruby
```ruby
not_found do
'Isto está longe de ser encontrado'
end
@ -516,7 +516,7 @@ O manipulador `error` é invocado sempre que uma exceção é lançada a
partir de um bloco de rota ou um filtro. O objecto da exceção pode ser
obtido a partir da variável Rack `sinatra.error`:
``` ruby
```ruby
error do
'Peço desculpa, houve um erro desagradável - ' + env['sinatra.error'].message
end
@ -524,7 +524,7 @@ end
Erros personalizados:
``` ruby
```ruby
error MeuErroPersonalizado do
'O que aconteceu foi...' + env['sinatra.error'].message
end
@ -532,7 +532,7 @@ end
Então, se isso acontecer:
``` ruby
```ruby
get '/' do
raise MeuErroPersonalizado, 'alguma coisa desagradável'
end
@ -547,7 +547,7 @@ O que aconteceu foi...alguma coisa desagradável
Alternativamente, pode definir um manipulador de erro para um código de
status:
``` ruby
```ruby
error 403 do
'Accesso negado'
end
@ -559,7 +559,7 @@ end
Ou um range (alcance):
``` ruby
```ruby
error 400..510 do
'Boom'
end
@ -574,13 +574,13 @@ Quando utilizamos `send_file` ou arquivos estáticos pode ter mime types
Sinatra não entendidos. Use `mime_type` para os registar por extensão de
arquivos:
``` ruby
```ruby
mime_type :foo, 'text/foo'
```
Pode também utilizar isto com o helper `content_type`:
``` ruby
```ruby
content_type :foo
```
@ -596,7 +596,7 @@ para providenciar varios tipos de funcionalidades comuns.
O Sinatra torna a construção de pipelines do middleware Rack fácil a um
nível superior utilizando o método `use`:
``` ruby
```ruby
require 'sinatra'
require 'meu_middleware_personalizado'
@ -613,7 +613,7 @@ A semântica de `use` é idêntica aquela definida para a DSL
(mais frequentemente utilizada para arquivos rackup). Por exemplo, o
método `use` aceita múltiplos argumentos/variáveis, bem como blocos:
``` ruby
```ruby
use Rack::Auth::Basic do |utilizador, senha|
utilizador == 'admin' && senha == 'secreto'
end
@ -631,7 +631,7 @@ Testes no Sinatra podem ser escritos utilizando qualquer biblioteca ou
framework de teste baseados no Rack.
[Rack::Test](http://gitrdoc.com/brynary/rack-test) é recomendado:
``` ruby
```ruby
require 'minha_aplicacao_sinatra'
require 'rack/test'
@ -673,7 +673,7 @@ estilo de configuração de micro aplicativos (exemplo: um simples arquivo
de aplicação, directórios `./public` e `./views`, logs, página de detalhes
de excepção, etc.). É onde o Sinatra::Base entra em jogo:
``` ruby
```ruby
require 'sinatra/base'
class MinhaApp < Sinatra::Base
@ -691,7 +691,7 @@ como um middleware Rack, uma aplicação Rack, ou metal Rails. Pode
utilizar ou executar esta classe com um arquivo rackup `config.ru`;
ou, controlar um componente de servidor fornecendo como biblioteca:
``` ruby
```ruby
MinhaApp.run! :host => 'localhost', :port => 9090
```
@ -726,7 +726,7 @@ principal](http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854
As aplicações Sinatra podem ser executadas directamente:
``` shell
```shell
ruby minhaapp.rb [-h] [-x] [-e AMBIENTE] [-p PORTA] [-o HOST] [-s SERVIDOR]
```
@ -747,7 +747,7 @@ Se gostaria de utilizar o código da última versão do Sinatra, crie um
clone local e execute sua aplicação com o directório `sinatra/lib` no
`LOAD_PATH`:
``` shell
```shell
cd minhaapp
git clone git://github.com/sinatra/sinatra.git
ruby -I sinatra/lib minhaapp.rb
@ -756,7 +756,7 @@ ruby -I sinatra/lib minhaapp.rb
Alternativamente, pode adicionar o directório do `sinatra/lib` no
`LOAD_PATH` do seu aplicativo:
``` ruby
```ruby
$LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
require 'rubygems'
require 'sinatra'
@ -768,7 +768,7 @@ end
Para actualizar o código do Sinatra no futuro:
``` shell
```shell
cd meuprojeto/sinatra
git pull
```

View File

@ -105,13 +105,13 @@ end
Установите gem:
``` shell
```shell
gem install sinatra
```
и запустите приложение с помощью:
``` shell
```shell
ruby myapp.rb
```
@ -1016,7 +1016,7 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
Перед тем, как использовать шаблоны стилус, загрузите `stylus` и
`stylus/tilt`:
``` ruby
```ruby
require 'sinatra'
require 'stylus'
require 'stylus/tilt'
@ -1380,7 +1380,7 @@ set :sessions, :domain => 'foo.com'
Чтобы сделать сессию доступной другим приложениям, размещенным на поддоменах
foo.com, добавьте *.* перед доменом:
``` ruby
```ruby
set :sessions, :domain => '.foo.com'
```

View File

@ -6,7 +6,7 @@
Sinatra是一个基于Ruby语言的[DSL](http://en.wikipedia.org/wiki/Domain-specific_language)
领域专属语言可以轻松、快速的创建web应用。
~~~~ ruby
~~~~ruby
# myapp.rb
require 'sinatra'
@ -17,7 +17,7 @@ end
安装gem然后运行
~~~~ shell
~~~~shell
gem install sinatra
ruby myapp.rb
~~~~
@ -26,7 +26,7 @@ ruby myapp.rb
这个时候访问地址将绑定到 127.0.0.1 和 localhost ,如果使用 vagrant 进行开发,访问会失败,此时就需要进行 ip 绑定了:
~~~~ shell
~~~~shell
ruby myapp.rb -o 0.0.0.0
~~~~
@ -39,7 +39,7 @@ ruby myapp.rb -o 0.0.0.0
在Sinatra中一个路由分为两部分HTTP方法(GET, POST等)和URL匹配范式。
每个路由都有一个要执行的代码块:
~~~~ ruby
~~~~ruby
get '/' do
.. 显示内容 ..
end
@ -75,7 +75,7 @@ end
路由范式可以包括具名参数,可通过`params`哈希表获得:
~~~~ ruby
~~~~ruby
get '/hello/:name' do
# 匹配 "GET /hello/foo" 和 "GET /hello/bar"
# params['name'] 的值是 'foo' 或者 'bar'
@ -85,7 +85,7 @@ end
你同样可以通过代码块参数获得具名参数:
~~~~ ruby
~~~~ruby
get '/hello/:name' do |n|
"Hello #{n}!"
end
@ -93,7 +93,7 @@ end
路由范式也可以包含通配符参数, 可以通过`params['splat']`数组获得。
~~~~ ruby
~~~~ruby
get '/say/*/to/*' do
# 匹配 /say/hello/to/world
params['splat'] # => ["hello", "world"]
@ -107,7 +107,7 @@ end
通过正则表达式匹配的路由:
~~~~ ruby
~~~~ruby
get /\A\/hello\/([\w]+)\z/ do
"Hello, #{params['captures'].first}!"
end
@ -115,7 +115,7 @@ end
或者使用代码块参数:
~~~~ ruby
~~~~ruby
get %r{/hello/([\w]+)} do |c|
"Hello, #{c}!"
end
@ -125,7 +125,7 @@ end
路由也可以包含多样的匹配条件比如user agent
~~~~ ruby
~~~~ruby
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
"你正在使用Songbird版本是 #{params['agent'][0]}"
end
@ -137,7 +137,7 @@ end
其他可选的条件是 `host_name``provides`
~~~~ ruby
~~~~ruby
get '/', :host_name => /^admin\./ do
"管理员区域,无权进入!"
end
@ -153,7 +153,7 @@ end
你也可以自定义条件:
~~~~ ruby
~~~~ruby
set(:probability) { |value| condition { rand <= value } }
get '/win_a_car', :probability => 0.1 do
@ -186,7 +186,7 @@ body对象或者HTTP状态码
那样,我们可以轻松的实现例如流式传输的例子:
~~~~ ruby
~~~~ruby
class Stream
def each
100.times { |i| yield "#{i}\n" }
@ -201,7 +201,7 @@ get('/') { Stream.new }
如上显示Sinatra内置了对于使用字符串和正则表达式作为路由匹配的支持。
但是,它并没有只限于此。 你可以非常容易地定义你自己的匹配器:
~~~~ ruby
~~~~ruby
class AllButPattern
Match = Struct.new(:captures)
@ -226,7 +226,7 @@ end
上面的例子可能太繁琐了, 因为它也可以用更简单的方式表述:
~~~~ ruby
~~~~ruby
get // do
pass if request.path_info == "/index"
# ...
@ -235,7 +235,7 @@ end
或者,使用消极向前查找:
~~~~ ruby
~~~~ruby
get %r{^(?!/index$)} do
# ...
end
@ -246,7 +246,7 @@ end
静态文件是从 `./public_folder` 目录提供服务。你可以通过设置`:public`
选项设定一个不同的位置:
~~~~ ruby
~~~~ruby
set :public_folder, File.dirname(__FILE__) + '/static'
~~~~
@ -258,7 +258,7 @@ set :public_folder, File.dirname(__FILE__) + '/static'
模板被假定直接位于`./views`目录。 要使用不同的视图目录:
~~~~ ruby
~~~~ruby
set :views, File.dirname(__FILE__) + '/templates'
~~~~
@ -270,7 +270,7 @@ set :views, File.dirname(__FILE__) + '/templates'
需要引入 `haml` gem/library以填充 HAML 模板:
~~~~ ruby
~~~~ruby
# 你需要在你的应用中引入 haml
require 'haml'
@ -286,7 +286,7 @@ end
[选项和配置](http://www.sinatrarb.com/configuration.html)
也可以个别的被覆盖。
~~~~ ruby
~~~~ruby
set :haml, {:format => :html5 } # 默认的Haml输出格式是 :xhtml
get '/' do
@ -296,7 +296,7 @@ end
### Erb模板
~~~~ ruby
~~~~ruby
# 你需要在你的应用中引入 erb
require 'erb'
@ -311,7 +311,7 @@ end
需要引入 `erubis` gem/library以填充 erubis 模板:
~~~~ ruby
~~~~ruby
# 你需要在你的应用中引入 erubis
require 'erubis'
@ -324,7 +324,7 @@ end
使用Erubis代替Erb也是可能的:
~~~~ ruby
~~~~ruby
require 'erubis'
Tilt.register :erb, Tilt[:erubis]
@ -339,7 +339,7 @@ end
需要引入 `builder` gem/library 以填充 builder templates
~~~~ ruby
~~~~ruby
# 需要在你的应用中引入builder
require 'builder'
@ -354,7 +354,7 @@ end
需要引入 `nokogiri` gem/library 以填充 nokogiri 模板:
~~~~ ruby
~~~~ruby
# 需要在你的应用中引入 nokogiri
require 'nokogiri'
@ -369,7 +369,7 @@ end
需要引入 `haml` 或者 `sass` gem/library 以填充 Sass 模板:
~~~~ ruby
~~~~ruby
# 需要在你的应用中引入 haml 或者 sass
require 'sass'
@ -386,7 +386,7 @@ end
[选项和配置(英文)](http://www.sinatrarb.com/configuration.html),
也可以在个体的基础上覆盖。
~~~~ ruby
~~~~ruby
set :sass, {:style => :compact } # 默认的 Sass 样式是 :nested
get '/stylesheet.css' do
@ -398,7 +398,7 @@ end
需要引入 `haml` 或者 `sass` gem/library 来填充 Scss templates
~~~~ ruby
~~~~ruby
# 需要在你的应用中引入 haml 或者 sass
require 'sass'
@ -414,7 +414,7 @@ end
[选项和配置(英文)](http://www.sinatrarb.com/configuration.html),
也可以在个体的基础上覆盖。
~~~~ ruby
~~~~ruby
set :scss, :style => :compact # default Scss style is :nested
get '/stylesheet.css' do
@ -426,7 +426,7 @@ end
需要引入 `less` gem/library 以填充 Less 模板:
~~~~ ruby
~~~~ruby
# 需要在你的应用中引入 less
require 'less'
@ -441,7 +441,7 @@ end
需要引入 `liquid` gem/library 来填充 Liquid 模板:
~~~~ ruby
~~~~ruby
# 需要在你的应用中引入 liquid
require 'liquid'
@ -455,7 +455,7 @@ end
因为你不能在Liquid 模板中调用 Ruby 方法 (除了 `yield`)
你几乎总是需要传递locals给它
~~~~ ruby
~~~~ruby
liquid :index, :locals => { :key => 'value' }
~~~~
@ -463,7 +463,7 @@ liquid :index, :locals => { :key => 'value' }
需要引入 `rdiscount` gem/library 以填充 Markdown 模板:
~~~~ ruby
~~~~ruby
# 需要在你的应用中引入rdiscount
require "rdiscount"
@ -477,13 +477,13 @@ end
在markdown中是不可以调用方法的也不可以传递 locals给它。
你因此一般会结合其他的填充引擎来使用它:
~~~~ ruby
~~~~ruby
erb :overview, :locals => { :text => markdown(:introduction) }
~~~~
请注意你也可以从其他模板中调用 markdown 方法:
~~~~ ruby
~~~~ruby
%h1 Hello From Haml!
%p= markdown(:greetings)
~~~~
@ -492,7 +492,7 @@ erb :overview, :locals => { :text => markdown(:introduction) }
不过,使用其他填充引擎作为模版的布局是可能的,
通过传递`:layout_engine`选项:
~~~~ ruby
~~~~ruby
get '/' do
markdown :index, :layout_engine => :erb
end
@ -502,7 +502,7 @@ end
请记住你可以全局设定这个选项:
~~~~ ruby
~~~~ruby
set :markdown, :layout_engine => :haml, :layout => :post
get '/' do
@ -515,7 +515,7 @@ end
也可能使用BlueCloth而不是RDiscount来解析Markdown文件:
~~~~ ruby
~~~~ruby
require 'bluecloth'
Tilt.register 'markdown', BlueClothTemplate
@ -533,7 +533,7 @@ end
需要引入 `RedCloth` gem/library 以填充 Textile 模板:
~~~~ ruby
~~~~ruby
# 在你的应用中引入redcloth
require "redcloth"
@ -547,13 +547,13 @@ end
在textile中是不可以调用方法的也不可以传递 locals给它。
你因此一般会结合其他的填充引擎来使用它:
~~~~ ruby
~~~~ruby
erb :overview, :locals => { :text => textile(:introduction) }
~~~~
请注意你也可以从其他模板中调用`textile`方法:
~~~~ ruby
~~~~ruby
%h1 Hello From Haml!
%p= textile(:greetings)
~~~~
@ -562,7 +562,7 @@ erb :overview, :locals => { :text => textile(:introduction) }
不过,使用其他填充引擎作为模版的布局是可能的,
通过传递`:layout_engine`选项:
~~~~ ruby
~~~~ruby
get '/' do
textile :index, :layout_engine => :erb
end
@ -573,7 +573,7 @@ end
请记住你可以全局设定这个选项:
~~~~ ruby
~~~~ruby
set :textile, :layout_engine => :haml, :layout => :post
get '/' do
@ -588,7 +588,7 @@ end
需要引入 `RDoc` gem/library 以填充RDoc模板
~~~~ ruby
~~~~ruby
# 需要在你的应用中引入rdoc/markup/to_html
require "rdoc"
require "rdoc/markup/to_html"
@ -603,13 +603,13 @@ end
在rdoc中是不可以调用方法的也不可以传递locals给它。
你因此一般会结合其他的填充引擎来使用它:
~~~~ ruby
~~~~ruby
erb :overview, :locals => { :text => rdoc(:introduction) }
~~~~
请注意你也可以从其他模板中调用`rdoc`方法:
~~~~ ruby
~~~~ruby
%h1 Hello From Haml!
%p= rdoc(:greetings)
~~~~
@ -618,7 +618,7 @@ erb :overview, :locals => { :text => rdoc(:introduction) }
不过,使用其他填充引擎作为模版的布局是可能的,
通过传递`:layout_engine`选项:
~~~~ ruby
~~~~ruby
get '/' do
rdoc :index, :layout_engine => :erb
end
@ -628,7 +628,7 @@ end
请记住你可以全局设定这个选项:
~~~~ ruby
~~~~ruby
set :rdoc, :layout_engine => :haml, :layout => :post
get '/' do
@ -643,7 +643,7 @@ end
需要引入 `radius` gem/library 以填充 Radius 模板:
~~~~ ruby
~~~~ruby
# 需要在你的应用中引入radius
require 'radius'
@ -657,7 +657,7 @@ end
因为你不能在Radius 模板中调用 Ruby 方法 (除了 `yield`)
你几乎总是需要传递locals给它
~~~~ ruby
~~~~ruby
radius :index, :locals => { :key => 'value' }
~~~~
@ -665,7 +665,7 @@ radius :index, :locals => { :key => 'value' }
需要引入`markaby` gem/library以填充Markaby模板
~~~~ ruby
~~~~ruby
#需要在你的应用中引入 markaby
require 'markaby'
@ -678,7 +678,7 @@ end
你也可以使用嵌入的 Markaby:
~~~~ ruby
~~~~ruby
get '/' do
markaby { h1 "Welcome!" }
end
@ -688,7 +688,7 @@ end
需要引入 `slim` gem/library 来填充 Slim 模板:
~~~~ ruby
~~~~ruby
# 需要在你的应用中引入 slim
require 'slim'
@ -703,7 +703,7 @@ end
需要引入 `creole` gem/library 来填充 Creole 模板:
~~~~ ruby
~~~~ruby
# 需要在你的应用中引入 creole
require 'creole'
@ -731,7 +731,7 @@ end
现在你可以调用 CoffeeScript 模版了:
~~~~ ruby
~~~~ruby
# 需要在你的应用中引入coffee-script
require 'coffee-script'
@ -744,7 +744,7 @@ end
### 嵌入模板字符串
~~~~ ruby
~~~~ruby
get '/' do
haml '%div.title Hello World'
end
@ -757,7 +757,7 @@ end
模板和路由执行器在同样的上下文求值。
在路由执行器中赋值的实例变量可以直接被模板访问。
~~~~ ruby
~~~~ruby
get '/:id' do
@foo = Foo.find(params['id'])
haml '%h1= @foo.name'
@ -766,7 +766,7 @@ end
或者,显式地指定一个本地变量的哈希:
~~~~ ruby
~~~~ruby
get '/:id' do
foo = Foo.find(params['id'])
haml '%h1= foo.name', :locals => { :foo => foo }
@ -779,7 +779,7 @@ end
模板可以在源文件的末尾定义:
~~~~ ruby
~~~~ruby
require 'sinatra'
get '/' do
@ -804,7 +804,7 @@ __END__
模板可以通过使用顶层 `template` 方法定义:
~~~~ ruby
~~~~ruby
template :layout do
"%html\n =yield\n"
end
@ -822,7 +822,7 @@ end
你可以单独地通过传送 `:layout => false`来禁用,
或者通过`set :haml, :layout => false`来禁用他们。
~~~~ ruby
~~~~ruby
get '/' do
haml :index, :layout => !request.xhr?
end
@ -834,7 +834,7 @@ end
`Tilt.register`。比如,如果你喜欢使用 `tt`
作为Textile模版的扩展名你可以这样做:
~~~~ ruby
~~~~ruby
Tilt.register :tt, Tilt[:textile]
~~~~
@ -842,7 +842,7 @@ Tilt.register :tt, Tilt[:textile]
首先通过Tilt注册你自己的引擎然后创建一个填充方法:
~~~~ ruby
~~~~ruby
Tilt.register :myat, MyAwesomeTemplateEngine
helpers do
@ -863,7 +863,7 @@ end
前置过滤器在每个请求前,在请求的上下文环境中被执行,
而且可以修改请求和响应。 在过滤器中设定的实例变量可以被路由和模板访问:
~~~~ ruby
~~~~ruby
before do
@note = 'Hi!'
request.path_info = '/foo/bar/baz'
@ -879,7 +879,7 @@ end
而且可以修改请求和响应。
在前置过滤器和路由中设定的实例变量可以被后置过滤器访问:
~~~~ ruby
~~~~ruby
after do
puts response.status
end
@ -890,7 +890,7 @@ end
过滤器可以可选地带有范式, 只有请求路径满足该范式时才会执行:
~~~~ ruby
~~~~ruby
before '/protected/*' do
authenticate!
end
@ -902,7 +902,7 @@ end
和路由一样,过滤器也可以带有条件:
~~~~ ruby
~~~~ruby
before :agent => /Songbird/ do
# ...
end
@ -916,7 +916,7 @@ end
使用顶层的 `helpers` 方法来定义辅助方法, 以便在路由处理器和模板中使用:
~~~~ ruby
~~~~ruby
helpers do
def bar(name)
"#{name}bar"
@ -933,7 +933,7 @@ end
Session被用来在请求之间保持状态。如果被激活每一个用户会话
对应有一个session哈希:
~~~~ ruby
~~~~ruby
enable :sessions
get '/' do
@ -950,7 +950,7 @@ end
你可以使用任何的Rack session中间件为了这么做 \*不要\*调用
`enable :sessions`,而是 按照自己的需要引入你的中间件:
~~~~ ruby
~~~~ruby
use Rack::Session::Pool, :expire_after => 2592000
get '/' do
@ -966,31 +966,31 @@ end
要想直接地停止请求,在过滤器或者路由中使用:
~~~~ ruby
~~~~ruby
halt
~~~~
你也可以指定挂起时的状态码:
~~~~ ruby
~~~~ruby
halt 410
~~~~
或者消息体:
~~~~ ruby
~~~~ruby
halt 'this will be the body'
~~~~
或者两者;
~~~~ ruby
~~~~ruby
halt 401, 'go away!'
~~~~
也可以带消息头:
~~~~ ruby
~~~~ruby
halt 402, {'Content-Type' => 'text/plain'}, 'revenge'
~~~~
@ -998,7 +998,7 @@ halt 402, {'Content-Type' => 'text/plain'}, 'revenge'
一个路由可以放弃处理,将处理让给下一个匹配的路由,使用 `pass`
~~~~ ruby
~~~~ruby
get '/guess/:who' do
pass unless params['who'] == 'Frank'
'You got me!'
@ -1017,7 +1017,7 @@ end
有些时候,`pass` 并不是你想要的,你希望得到的是另一个路由的结果
。简单的使用 `call` 可以做到这一点:
~~~~ ruby
~~~~ruby
get '/foo' do
status, headers, body = call env.merge("PATH_INFO" => '/bar')
[status, headers, body.map(&:upcase)]
@ -1046,7 +1046,7 @@ end
`body` 辅助方法这么做。 如果你这样做了,
你可以在那以后使用该方法获得消息体:
~~~~ ruby
~~~~ruby
get '/foo' do
body "bar"
end
@ -1061,7 +1061,7 @@ end
和消息体类似,你也可以设定状态码和消息头:
~~~~ ruby
~~~~ruby
get '/foo' do
status 418
headers \
@ -1079,13 +1079,13 @@ end
使用 `send_file` 或者静态文件的时候Sinatra可能不能识别你的媒体类型。
使用 `mime_type` 通过文件扩展名来注册它们:
~~~~ ruby
~~~~ruby
mime_type :foo, 'text/foo'
~~~~
你也可以使用 `content_type` 辅助方法:
~~~~ ruby
~~~~ruby
get '/' do
content_type :foo
"foo foo foo"
@ -1096,7 +1096,7 @@ end
为了生成URL你需要使用 `url` 辅助方法, 例如在Haml中:
~~~~ ruby
~~~~ruby
%a{:href => url('/foo')} foo
~~~~
@ -1108,7 +1108,7 @@ end
你可以通过 `redirect` 辅助方法触发浏览器重定向:
~~~~ ruby
~~~~ruby
get '/foo' do
redirect to('/bar')
end
@ -1116,14 +1116,14 @@ end
其他参数的用法,与 `halt`相同:
~~~~ ruby
~~~~ruby
redirect to('/bar'), 303
redirect 'http://google.com', 'wrong place, buddy'
~~~~
`redirect back`可以把用户重定向到原始页面:
~~~~ ruby
~~~~ruby
get '/foo' do
"<a href='/bar'>do something</a>"
end
@ -1136,13 +1136,13 @@ end
如果想传递参数给redirect可以用query string:
~~~~ ruby
~~~~ruby
redirect to('/bar?sum=42')
~~~~
或者用session:
~~~~ ruby
~~~~ruby
enable :sessions
get '/foo' do
@ -1161,7 +1161,7 @@ end
你可以这样设定 Cache-Control 消息头:
~~~~ ruby
~~~~ruby
get '/' do
cache_control :public
"cache it!"
@ -1170,7 +1170,7 @@ end
核心提示: 在前置过滤器中设定缓存.
~~~~ ruby
~~~~ruby
before do
cache_control :public, :must_revalidate, :max_age => 60
end
@ -1179,7 +1179,7 @@ end
如果你正在用 `expires` 辅助方法设定对应的消息头 `Cache-Control`
会自动设定:
~~~~ ruby
~~~~ruby
before do
expires 500, :public, :must_revalidate
end
@ -1190,7 +1190,7 @@ end
如果客户端在缓存中已经有相关内容,就会立即得到显示。
~~~~ ruby
~~~~ruby
get '/article/:id' do
@article = Article.find params['id']
last_modified @article.updated_at
@ -1203,7 +1203,7 @@ end
ETag](http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation)
也是有可能的:
~~~~ ruby
~~~~ruby
etag @article.sha1, :weak
~~~~
@ -1211,7 +1211,7 @@ etag @article.sha1, :weak
如果你在寻找缓存的快速解决方案,试试
[rack-cache](https://github.com/rtomayko/rack-cache):
~~~~ ruby
~~~~ruby
require "rack/cache"
require "sinatra"
@ -1228,7 +1228,7 @@ end
为了发送文件,你可以使用 `send_file` 辅助方法:
~~~~ ruby
~~~~ruby
get '/' do
send_file 'foo.png'
end
@ -1236,7 +1236,7 @@ end
也可以带一些选项:
~~~~ ruby
~~~~ruby
send_file 'foo.png', :type => :jpg
~~~~
@ -1270,7 +1270,7 @@ send_file 'foo.png', :type => :jpg
传入的请求对象可以在请求层(过滤器,路由,错误处理) 通过 `request`
方法被访问:
~~~~ ruby
~~~~ruby
# 在 http://example.com/example 上运行的应用
get '/foo' do
request.body # 被客户端设定的请求体(见下)
@ -1301,7 +1301,7 @@ end
一些选项,例如 `script_name` 或者 `path_info` 也是可写的:
~~~~ ruby
~~~~ruby
before { request.path_info = "/" }
get "/" do
@ -1311,7 +1311,7 @@ end
`request.body` 是一个IO或者StringIO对象
~~~~ ruby
~~~~ruby
post "/api" do
request.body.rewind # 如果已经有人读了它
data = JSON.parse request.body.read
@ -1324,7 +1324,7 @@ end
你可以使用 `attachment` 辅助方法来告诉浏览器响应
应当被写入磁盘而不是在浏览器中显示。
~~~~ ruby
~~~~ruby
get '/' do
attachment
"store it!"
@ -1333,7 +1333,7 @@ end
你也可以传递一个文件名:
~~~~ ruby
~~~~ruby
get '/' do
attachment "info.txt"
"store it!"
@ -1344,7 +1344,7 @@ end
`find_template` 辅助方法被用于在填充时查找模板文件:
~~~~ ruby
~~~~ruby
find_template settings.views, 'foo', Tilt[:haml] do |file|
puts "could be #{file}"
end
@ -1353,7 +1353,7 @@ end
这并不是很有用。但是在你需要重载这个方法
来实现你自己的查找机制的时候有用。 比如,如果你想支持多于一个视图目录:
~~~~ ruby
~~~~ruby
set :views, ['views', 'templates']
helpers do
@ -1365,7 +1365,7 @@ end
另一个例子是为不同的引擎使用不同的目录:
~~~~ ruby
~~~~ruby
set :views, :sass => 'views/sass', :haml => 'templates', :default => 'views'
helpers do
@ -1389,7 +1389,7 @@ end
运行一次,在启动的时候,在任何环境下:
~~~~ ruby
~~~~ruby
configure do
# setting one option
set :option, 'value'
@ -1410,7 +1410,7 @@ end
只当环境 (RACK\_ENV environment 变量) 被设定为 `:production`的时候运行:
~~~~ ruby
~~~~ruby
configure :production do
...
end
@ -1418,7 +1418,7 @@ end
当环境被设定为 `:production` 或者 `:test`的时候运行:
~~~~ ruby
~~~~ruby
configure :production, :test do
...
end
@ -1426,7 +1426,7 @@ end
你可以使用 `settings` 获得这些配置:
~~~~ ruby
~~~~ruby
configure do
set :foo, 'bar'
end
@ -1598,7 +1598,7 @@ end
当一个 `Sinatra::NotFound` 错误被抛出的时候,
或者响应状态码是404`not_found` 处理器会被调用:
~~~~ ruby
~~~~ruby
not_found do
'This is nowhere to be found'
end
@ -1609,7 +1609,7 @@ end
`error` 处理器,在任何路由代码块或者过滤器抛出异常的时候会被调用。
异常对象可以通过`sinatra.error` Rack 变量获得:
~~~~ ruby
~~~~ruby
error do
'Sorry there was a nasty error - ' + env['sinatra.error'].message
end
@ -1617,7 +1617,7 @@ end
自定义错误:
~~~~ ruby
~~~~ruby
error MyCustomError do
'So what happened was...' + env['sinatra.error'].message
end
@ -1625,7 +1625,7 @@ end
那么,当这个发生的时候:
~~~~ ruby
~~~~ruby
get '/' do
raise MyCustomError, 'something bad'
end
@ -1637,7 +1637,7 @@ end
另一种替代方法是,为一个状态码安装错误处理器:
~~~~ ruby
~~~~ruby
error 403 do
'Access forbidden'
end
@ -1649,7 +1649,7 @@ end
或者一个范围:
~~~~ ruby
~~~~ruby
error 400..510 do
'Boom'
end
@ -1667,7 +1667,7 @@ Rack的一个最有趣的面向应用开发者的能力是支持“中间件”
Sinatra 让建立Rack中间件管道异常简单 通过顶层的 `use` 方法:
~~~~ ruby
~~~~ruby
require 'sinatra'
require 'my_custom_middleware'
@ -1684,7 +1684,7 @@ end
DSL(在rack文件中最频繁使用)中定义的完全一样。例如,`use` 方法接受
多个/可变 参数,包括代码块:
~~~~ ruby
~~~~ruby
use Rack::Auth::Basic do |username, password|
username == 'admin' && password == 'secret'
end
@ -1699,7 +1699,7 @@ Rack中分布有多样的标准中间件针对日志
Sinatra的测试可以使用任何基于Rack的测试程序库或者框架来编写。
[Rack::Test](http://gitrdoc.com/brynary/rack-test) 是推荐候选:
~~~~ ruby
~~~~ruby
require 'my_sinatra_app'
require 'minitest/autorun'
require 'rack/test'
@ -1741,7 +1741,7 @@ metal带有服务器组件的简单程序库
./views 目录,日志,异常细节页面,等等)。 这时应该让 Sinatra::Base
走到台前了:
~~~~ ruby
~~~~ruby
require 'sinatra/base'
class MyApp < Sinatra::Base
@ -1797,7 +1797,7 @@ Sinatra::Base子类可用的方法实际上就是通过顶层 DSL 可用的方
有两种方式运行一个模块化应用,使用 `run!`来运行:
~~~~ ruby
~~~~ruby
# my_app.rb
require 'sinatra/base'
@ -1815,7 +1815,7 @@ end
或者使用一个 `config.ru`允许你使用任何Rack处理器:
~~~~ ruby
~~~~ruby
# config.ru
require './my_app'
run MyApp
@ -1829,7 +1829,7 @@ run MyApp
编写你的应用:
~~~~ ruby
~~~~ruby
# app.rb
require 'sinatra'
@ -1840,7 +1840,7 @@ end
加入相应的 `config.ru`:
~~~~ ruby
~~~~ruby
require './app'
run Sinatra::Application
~~~~
@ -1865,7 +1865,7 @@ run Sinatra::Application
这个端点可以是任何Sinatra应用或者任何基于Rack的应用程序
(Rails/Ramaze/Camping/…)。
~~~~ ruby
~~~~ruby
require 'sinatra/base'
class LoginScreen < Sinatra::Base
@ -1911,7 +1911,7 @@ Sinatra::Application或者这个类就是你显式创建的子类。
通过 \`set\` 创建的选项是类层面的方法:
~~~~ ruby
~~~~ruby
class MyApp < Sinatra::Base
# 嘿,我在应用变量域!
set :foo, 42
@ -1947,7 +1947,7 @@ end
\`haml\`。你可以在请求变量域当中通过\`settings\`辅助方法
访问应用变量域:
~~~~ ruby
~~~~ruby
class MyApp < Sinatra::Base
# 嘿,我在应用变量域!
get '/define_route/:name' do
@ -2097,7 +2097,7 @@ Sinatra应该会运行在任何支持上述Ruby实现的操作系统。
然后,在你的项目目录下,创建一个 `Gemfile`:
~~~~ ruby
~~~~ruby
source :rubygems
gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"