mirror of
https://github.com/sinatra/sinatra
synced 2023-03-27 23:18:01 -04:00
Remove unnecessary whitespaces
This commit is contained in:
parent
1d48ab2929
commit
d66cfcc451
10 changed files with 1015 additions and 1015 deletions
26
README.de.md
26
README.de.md
|
@ -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
|
||||
|
|
272
README.es.md
272
README.es.md
File diff suppressed because it is too large
Load diff
298
README.fr.md
298
README.fr.md
File diff suppressed because it is too large
Load diff
282
README.ja.md
282
README.ja.md
File diff suppressed because it is too large
Load diff
296
README.ko.md
296
README.ko.md
File diff suppressed because it is too large
Load diff
196
README.pt-br.md
196
README.pt-br.md
|
@ -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
|
||||
```
|
||||
|
|
110
README.pt-pt.md
110
README.pt-pt.md
|
@ -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
|
||||
```
|
||||
|
|
|
@ -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'
|
||||
```
|
||||
|
||||
|
|
250
README.zh.md
250
README.zh.md
|
@ -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"
|
||||
|
||||
|
|
Loading…
Reference in a new issue