sinatra 1.4.5 → 1.4.6
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/AUTHORS.md +77 -0
- data/CHANGES +30 -0
- data/Gemfile +5 -5
- data/README.de.md +186 -56
- data/README.es.md +76 -76
- data/README.fr.md +120 -56
- data/README.hu.md +19 -19
- data/README.ja.md +44 -46
- data/README.ko.md +163 -67
- data/README.md +151 -127
- data/README.pt-br.md +905 -144
- data/README.pt-pt.md +17 -17
- data/README.ru.md +88 -52
- data/README.zh.md +76 -68
- data/lib/sinatra.rb +0 -1
- data/lib/sinatra/base.rb +21 -15
- data/lib/sinatra/show_exceptions.rb +10 -4
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +1 -1
- data/test/asciidoctor_test.rb +2 -2
- data/test/base_test.rb +1 -5
- data/test/builder_test.rb +2 -2
- data/test/coffee_test.rb +8 -2
- data/test/compile_test.rb +1 -1
- data/test/contest.rb +3 -12
- data/test/creole_test.rb +2 -2
- data/test/delegator_test.rb +1 -1
- data/test/encoding_test.rb +1 -1
- data/test/erb_test.rb +1 -1
- data/test/extensions_test.rb +1 -1
- data/test/filter_test.rb +2 -2
- data/test/haml_test.rb +2 -2
- data/test/helper.rb +8 -7
- data/test/helpers_test.rb +6 -6
- data/test/integration_test.rb +3 -3
- data/test/less_test.rb +2 -2
- data/test/liquid_test.rb +3 -3
- data/test/mapped_error_test.rb +5 -5
- data/test/markaby_test.rb +2 -2
- data/test/markdown_test.rb +6 -3
- data/test/mediawiki_test.rb +2 -2
- data/test/middleware_test.rb +1 -1
- data/test/nokogiri_test.rb +2 -2
- data/test/rabl_test.rb +2 -2
- data/test/rack_test.rb +1 -1
- data/test/radius_test.rb +2 -2
- data/test/rdoc_test.rb +4 -4
- data/test/readme_test.rb +1 -1
- data/test/request_test.rb +4 -1
- data/test/response_test.rb +1 -1
- data/test/result_test.rb +2 -2
- data/test/route_added_hook_test.rb +1 -1
- data/test/routing_test.rb +7 -7
- data/test/sass_test.rb +3 -3
- data/test/scss_test.rb +2 -2
- data/test/server_test.rb +10 -2
- data/test/settings_test.rb +4 -4
- data/test/sinatra_test.rb +1 -1
- data/test/slim_test.rb +2 -2
- data/test/static_test.rb +2 -2
- data/test/streaming_test.rb +2 -2
- data/test/stylus_test.rb +2 -2
- data/test/templates_test.rb +3 -3
- data/test/textile_test.rb +2 -2
- data/test/wlang_test.rb +1 -1
- data/test/yajl_test.rb +2 -2
- metadata +10 -11
- data/AUTHORS +0 -61
data/README.pt-br.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
*Atenção: Este documento é apenas uma tradução da versão em inglês e
|
4
4
|
pode estar desatualizado.*
|
5
5
|
|
6
|
-
Alguns dos trechos de
|
6
|
+
Alguns dos trechos de código a seguir utilizam caracteres UTF-8. Então, caso esteja utilizando uma versão de ruby inferior à `2.0.0`, adicione o encoding no início de seus arquivos:
|
7
7
|
|
8
8
|
```ruby
|
9
9
|
# encoding: utf-8
|
@@ -38,6 +38,63 @@ Acesse: [localhost:4567](http://localhost:4567)
|
|
38
38
|
É recomendado também executar `gem install thin`. Caso esta gem esteja disponível, o
|
39
39
|
Sinatra irá utilizá-la.
|
40
40
|
|
41
|
+
## Conteúdo
|
42
|
+
|
43
|
+
* [Sinatra](#sinatra)
|
44
|
+
* [Conteúdo](#conteúdo)
|
45
|
+
* [Rotas](#rotas)
|
46
|
+
* [Condições](#condições)
|
47
|
+
* [Retorno de valores](#retorno-de-valores)
|
48
|
+
* [Validadores de rota personalizados](#validadores-de-rota-personalizados)
|
49
|
+
* [Arquivos estáticos](#arquivos-estáticos)
|
50
|
+
* [Views / Templates](#views--templates)
|
51
|
+
* [Literal Templates](#literal-templates)
|
52
|
+
* [Linguagens de template disponíveis](#linguagens-de-template-disponíveis)
|
53
|
+
* [Haml Templates](#haml-templates)
|
54
|
+
* [Erb Templates](#erb-templates)
|
55
|
+
* [Builder Templates](#builder-templates)
|
56
|
+
* [Nokogiri Templates](#nokogiri-templates)
|
57
|
+
* [Sass Templates](#sass-templates)
|
58
|
+
* [SCSS Templates](#scss-templates)
|
59
|
+
* [Less Templates](#less-templates)
|
60
|
+
* [Liquid Templates](#liquid-templates)
|
61
|
+
* [Markdown Templates](#markdown-templates)
|
62
|
+
* [Textile Templates](#textile-templates)
|
63
|
+
* [RDoc Templates](#rdoc-templates)
|
64
|
+
* [AsciiDoc Templates](#asciidoc-templates)
|
65
|
+
* [Radius Templates](#radius-templates)
|
66
|
+
* [Markaby Templates](#markaby-templates)
|
67
|
+
* [RABL Templates](#rabl-templates)
|
68
|
+
* [Slim Templates](#slim-templates)
|
69
|
+
* [Creole Templates](#creole-templates)
|
70
|
+
* [MediaWiki Templates](#mediawiki-templates)
|
71
|
+
* [CoffeeScript Templates](#coffeescript-templates)
|
72
|
+
* [Stylus Templates](#stylus-templates)
|
73
|
+
* [Yajl Templates](#yajl-templates)
|
74
|
+
* [WLang Templates](#wlang-templates)
|
75
|
+
* [Acessando Variáveis nos Templates](#acessando-variáveis-nos-templates)
|
76
|
+
* [Templates com `yield` e layouts aninhados](#templates-com-yield-e-layouts-aninhados)
|
77
|
+
* [Templates Inline](#templates-inline)
|
78
|
+
* [Templates Nomeados](#templates-nomeados)
|
79
|
+
* [Associando extensões de arquivos](#associando-extensões-de-arquivos)
|
80
|
+
* [Adicionando seu Próprio Engine de Template](#adicionando-seu-próprio-engine-de-template)
|
81
|
+
* [Customizando lógica para encontrar templates](#customizando-lógica-para-encontrar-templates)
|
82
|
+
* [Filtros](#filtros)
|
83
|
+
* [Helpers](#helpers)
|
84
|
+
* [Utilizando Sessões](#utilizando-sessões)
|
85
|
+
* [Halting](#halting)
|
86
|
+
* [Passing](#passing)
|
87
|
+
* [Desencadeando Outra Rota](#desencadeando-outra-rota)
|
88
|
+
* [Configuração](#configuração)
|
89
|
+
* [Tratamento de Erros](#tratamento-de-erros)
|
90
|
+
* [Erro](#erro)
|
91
|
+
* [Mime Types](#mime-types)
|
92
|
+
* [Rack Middleware](#rack-middleware)
|
93
|
+
* [Testando](#testando)
|
94
|
+
* [Sinatra::Base - Middleware, Bibliotecas e aplicativos modulares](#sinatrabase---middleware-bibliotecas-e-aplicativos-modulares)
|
95
|
+
* [Linha de comando](#linha-de-comando)
|
96
|
+
* [A última versão](#a-última-versão)
|
97
|
+
* [Mais](#mais)
|
41
98
|
|
42
99
|
## Rotas
|
43
100
|
|
@@ -66,61 +123,64 @@ delete '/' do
|
|
66
123
|
end
|
67
124
|
|
68
125
|
options '/' do
|
69
|
-
.. estabelecendo alguma coisa ..
|
126
|
+
.. estabelecendo alguma coisa ..pe
|
70
127
|
end
|
71
128
|
```
|
72
129
|
|
73
130
|
As rotas são interpretadas na ordem em que são definidas. A primeira
|
74
|
-
rota encontrada responde
|
131
|
+
rota encontrada responde a requisição.
|
75
132
|
|
76
|
-
Padrões de rota podem conter parâmetros nomeados,
|
133
|
+
Padrões de rota podem conter parâmetros nomeados, acessíveis por meio do
|
77
134
|
hash `params`:
|
78
135
|
|
79
136
|
``` ruby
|
80
137
|
get '/ola/:nome' do
|
81
138
|
# corresponde a "GET /ola/foo" e "GET /ola/bar"
|
82
|
-
# params[
|
83
|
-
"Olá #{params[
|
139
|
+
# params['nome'] é 'foo' ou 'bar'
|
140
|
+
"Olá #{params['nome']}!"
|
84
141
|
end
|
85
142
|
```
|
86
143
|
|
87
|
-
Você também pode acessar parâmetros nomeados
|
144
|
+
Você também pode acessar parâmetros nomeados por meio dos parâmetros de
|
88
145
|
um bloco:
|
89
146
|
|
90
147
|
``` ruby
|
91
148
|
get '/ola/:nome' do |n|
|
149
|
+
# corresponde a "GET /ola/foo" e "GET /ola/bar"
|
150
|
+
# params['nome'] é 'foo' ou 'bar'
|
151
|
+
# n guarda o valor de params['nome']
|
92
152
|
"Olá #{n}!"
|
93
153
|
end
|
94
154
|
```
|
95
155
|
|
96
|
-
Padrões de rota também podem conter parâmetros splat (
|
97
|
-
acessível
|
156
|
+
Padrões de rota também podem conter parâmetros splat (curinga),
|
157
|
+
acessível por meio do array `params['splat']`:
|
98
158
|
|
99
159
|
``` ruby
|
100
160
|
get '/diga/*/para/*' do
|
101
161
|
# corresponde a /diga/ola/para/mundo
|
102
|
-
params[
|
162
|
+
params['splat'] # => ["ola", "mundo"]
|
103
163
|
end
|
104
164
|
|
105
165
|
get '/download/*.*' do
|
106
|
-
# corresponde a /download/
|
107
|
-
params[
|
166
|
+
# corresponde a /download/caminho/do/arquivo.xml
|
167
|
+
params['splat'] # => ["caminho/do/arquivo", "xml"]
|
108
168
|
end
|
109
169
|
```
|
110
170
|
|
111
171
|
Ou com parâmetros de um bloco:
|
112
172
|
|
113
173
|
``` ruby
|
114
|
-
get '/download/*.*' do |
|
115
|
-
[
|
174
|
+
get '/download/*.*' do |caminho, ext|
|
175
|
+
[caminho, ext] # => ["caminho/do/arquivo", "xml"]
|
116
176
|
end
|
117
177
|
```
|
118
178
|
|
119
|
-
Rotas podem
|
179
|
+
Rotas podem casar com expressões regulares:
|
120
180
|
|
121
181
|
``` ruby
|
122
|
-
get
|
123
|
-
"Olá, #{params[
|
182
|
+
get /\A\/ola\/([\w]+)\z/ do
|
183
|
+
"Olá, #{params['captures'].first}!"
|
124
184
|
end
|
125
185
|
```
|
126
186
|
|
@@ -128,6 +188,7 @@ Ou com parâmetros de um bloco:
|
|
128
188
|
|
129
189
|
``` ruby
|
130
190
|
get %r{/ola/([\w]+)} do |c|
|
191
|
+
# corresponde a "GET /meta/ola/mundo", "GET /ola/mundo/1234" etc.
|
131
192
|
"Olá, #{c}!"
|
132
193
|
end
|
133
194
|
```
|
@@ -140,17 +201,28 @@ get '/posts.?:formato?' do
|
|
140
201
|
end
|
141
202
|
```
|
142
203
|
|
204
|
+
Rotas também podem utilizar query strings:
|
205
|
+
|
206
|
+
``` ruby
|
207
|
+
get '/posts' do
|
208
|
+
# corresponde a "GET /posts?titulo=foo&autor=bar"
|
209
|
+
titulo = params['titulo']
|
210
|
+
autor = params['autor']
|
211
|
+
# utiliza as variaveis titulo e autor; a query é opicional para a rota /posts
|
212
|
+
end
|
213
|
+
```
|
214
|
+
|
143
215
|
A propósito, a menos que você desative a proteção contra ataques (veja
|
144
216
|
abaixo), o caminho solicitado pode ser alterado antes de concluir a
|
145
217
|
comparação com as suas rotas.
|
146
218
|
|
147
|
-
|
219
|
+
## Condições
|
148
220
|
|
149
221
|
Rotas podem incluir uma variedade de condições, tal como o `user agent`:
|
150
222
|
|
151
223
|
``` ruby
|
152
224
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
153
|
-
"Você está usando o Songbird versão #{params[
|
225
|
+
"Você está usando o Songbird versão #{params['agent'][0]}"
|
154
226
|
end
|
155
227
|
|
156
228
|
get '/foo' do
|
@@ -173,6 +245,7 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
|
|
173
245
|
builder :feed
|
174
246
|
end
|
175
247
|
```
|
248
|
+
`provides` procura pelos Accept header das requisições
|
176
249
|
|
177
250
|
Você pode facilmente definir suas próprias condições:
|
178
251
|
|
@@ -188,7 +261,7 @@ get '/ganha_um_carro' do
|
|
188
261
|
end
|
189
262
|
```
|
190
263
|
|
191
|
-
Use splat, para uma condição que
|
264
|
+
Use splat, para uma condição que leva vários valores:
|
192
265
|
|
193
266
|
``` ruby
|
194
267
|
set(:auth) do |*roles| # <- observe o splat aqui
|
@@ -208,27 +281,27 @@ get "/apenas/administrador/", :auth => :administrador do
|
|
208
281
|
end
|
209
282
|
```
|
210
283
|
|
211
|
-
|
284
|
+
## Retorno de valores
|
212
285
|
|
213
286
|
O valor de retorno do bloco de uma rota determina pelo menos o corpo da
|
214
287
|
resposta passado para o cliente HTTP, ou pelo menos o próximo middleware
|
215
288
|
na pilha Rack. Frequentemente, isto é uma `string`, tal como nos
|
216
|
-
exemplos acima.
|
289
|
+
exemplos acima. Entretanto, outros valores também são aceitos.
|
217
290
|
|
218
291
|
Você pode retornar uma resposta válida ou um objeto para o Rack, sendo
|
219
|
-
eles de qualquer tipo de objeto que queira. Além
|
292
|
+
eles de qualquer tipo de objeto que queira. Além disso, é possível
|
220
293
|
retornar um código de status HTTP.
|
221
294
|
|
222
|
-
|
295
|
+
* Um array com três elementros: `[status (Fixnum), cabecalho (Hash),
|
223
296
|
corpo da resposta (responde à #each)]`
|
224
297
|
|
225
|
-
|
298
|
+
* Um array com dois elementros: `[status (Fixnum), corpo da resposta
|
226
299
|
(responde à #each)]`
|
227
300
|
|
228
|
-
|
301
|
+
* Um objeto que responda à `#each` sem passar nada, mas, sim, `strings`
|
229
302
|
para um dado bloco
|
230
303
|
|
231
|
-
|
304
|
+
* Um objeto `Fixnum` representando o código de status
|
232
305
|
|
233
306
|
Dessa forma, podemos implementar facilmente um exemplo de streaming:
|
234
307
|
|
@@ -245,7 +318,7 @@ get('/') { Stream.new }
|
|
245
318
|
Você também pode usar o método auxiliar `stream` (descrito abaixo) para
|
246
319
|
incorporar a lógica de streaming na rota.
|
247
320
|
|
248
|
-
|
321
|
+
## Validadores de Rota Personalizados
|
249
322
|
|
250
323
|
Como apresentado acima, a estrutura do Sinatra conta com suporte
|
251
324
|
embutido para uso de padrões de String e expressões regulares como
|
@@ -305,153 +378,692 @@ set :public_folder, File.dirname(__FILE__) + '/estatico'
|
|
305
378
|
|
306
379
|
Note que o nome do diretório público não é incluido na URL. Um arquivo
|
307
380
|
`./public/css/style.css` é disponibilizado como
|
308
|
-
`http://
|
381
|
+
`http://exemplo.com/css/style.css`.
|
309
382
|
|
310
383
|
## Views / Templates
|
311
384
|
|
312
|
-
|
313
|
-
utilizar um diretório view diferente:
|
385
|
+
Cada linguagem de template é exposta através de seu próprio método de renderização. Estes metodos simplesmente retornam uma string:
|
314
386
|
|
315
387
|
``` ruby
|
316
|
-
|
388
|
+
get '/' do
|
389
|
+
erb :index
|
390
|
+
end
|
317
391
|
```
|
318
392
|
|
319
|
-
|
320
|
-
dos templates como símbolos, mesmo se eles estiverem em um sub-diretório
|
321
|
-
(nesse caso utilize `:'subdir/template'`). Métodos de renderização irão
|
322
|
-
processar qualquer string passada diretamente para elas.
|
393
|
+
Isto renderiza `views/index.rb`
|
323
394
|
|
324
|
-
|
395
|
+
Ao invés do nome do template, você também pode passar direto o conteúdo do template:
|
325
396
|
|
326
|
-
|
397
|
+
```ruby
|
398
|
+
get '/' do
|
399
|
+
code = "<%= Time.now %>"
|
400
|
+
erb code
|
401
|
+
end
|
402
|
+
```
|
327
403
|
|
328
|
-
|
329
|
-
# Você precisa do 'require haml' em sua aplicação.
|
330
|
-
require 'haml'
|
404
|
+
Templates também aceitam um segundo argumento, um hash de opções:
|
331
405
|
|
406
|
+
``` ruby
|
332
407
|
get '/' do
|
333
|
-
|
408
|
+
erb :index, :layout => :post
|
334
409
|
end
|
335
410
|
```
|
336
411
|
|
337
|
-
|
412
|
+
Isto irá renderizar a `views/index.erb` inclusa dentro da `views/post.erb` (o padrão é a `views/layout.erb`, se existir).
|
338
413
|
|
339
|
-
|
340
|
-
Haml](http://haml.info/docs/yardoc/file.HAML_REFERENCE.html#options)
|
341
|
-
podem ser setadas globalmente através das configurações do sinatra, veja
|
342
|
-
[Opções e Configurações](http://www.sinatrarb.com/configuration.html), e
|
343
|
-
substitua em uma requisição individual.
|
414
|
+
Qualquer opção não reconhecida pelo Sinatra será passada adiante para o engine de template:
|
344
415
|
|
345
416
|
``` ruby
|
346
|
-
set :haml, {:format => :html5 } # o formato padrão do Haml é :xhtml
|
347
|
-
|
348
417
|
get '/' do
|
349
|
-
haml :index, :
|
418
|
+
haml :index, :format => :html5
|
350
419
|
end
|
351
420
|
```
|
352
421
|
|
353
|
-
|
422
|
+
Você também pode definir opções padrões para um tipo de template:
|
354
423
|
|
355
424
|
``` ruby
|
356
|
-
|
357
|
-
require 'erb'
|
425
|
+
set :haml, :format => :html5
|
358
426
|
|
359
427
|
get '/' do
|
360
|
-
|
428
|
+
haml :index
|
361
429
|
end
|
362
430
|
```
|
363
431
|
|
364
|
-
|
432
|
+
Opções passadas para o método de renderização sobrescreve as opções definitas através do método `set`.
|
433
|
+
|
434
|
+
Opções disponíveis:
|
435
|
+
|
436
|
+
<dl>
|
437
|
+
<dt>locals</dt>
|
438
|
+
<dd>
|
439
|
+
Lista de locais passado para o documento. Conveniente para *partials*
|
440
|
+
Exemplo: <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>
|
441
|
+
</dd>
|
442
|
+
|
443
|
+
<dt>default_encoding</dt>
|
444
|
+
<dd>
|
445
|
+
String encoding para ser utilizada em caso de incerteza. o padrão é <tt>settings.default_encoding</tt>.
|
446
|
+
</dd>
|
447
|
+
|
448
|
+
<dt>views</dt>
|
449
|
+
<dd>
|
450
|
+
Diretório de onde os templates são carregados. O padrão é <tt>settings.views</tt>.
|
451
|
+
</dd>
|
452
|
+
|
453
|
+
<dt>layout</dt>
|
454
|
+
<dd>
|
455
|
+
Para definir quando utilizar ou não um
|
456
|
+
layout (<tt>true</tt> ou <tt>false</tt>). E se for um
|
457
|
+
Symbol, especifica qual template usar. Exemplo:
|
458
|
+
<tt>erb :index, :layout => !request.xhr?</tt>
|
459
|
+
</dd>
|
460
|
+
|
461
|
+
<dt>content_type</dt>
|
462
|
+
<dd>
|
463
|
+
O *Content-Type* que o template produz. O padrão depente
|
464
|
+
da linguagem de template utilizada.
|
465
|
+
</dd>
|
466
|
+
|
467
|
+
<dt>scope</dt>
|
468
|
+
<dd>
|
469
|
+
Escopo em que o template será renderizado. Padrão é a
|
470
|
+
instancia da aplicação. Se você mudar isto as variáveis
|
471
|
+
de instânciae metodos auxiliares não serão
|
472
|
+
disponibilizados.
|
473
|
+
</dd>
|
474
|
+
|
475
|
+
<dt>layout_engine</dt>
|
476
|
+
<dd>
|
477
|
+
A engine de template utilizada para renderizar seu layout.
|
478
|
+
Útil para linguagens que não suportam templates de outra
|
479
|
+
forma. O padrão é a engine do template utilizado. Exemplo:
|
480
|
+
<tt>set :rdoc, :layout_engine => :erb</tt>
|
481
|
+
</dd>
|
482
|
+
|
483
|
+
<dt>layout_options</dt>
|
484
|
+
<dd>
|
485
|
+
Opções especiais utilizadas apenas para renderizar o
|
486
|
+
layout. Exemplo:
|
487
|
+
<tt>set :rdoc, :layout_options => { :views => 'views/layouts' }</tt>
|
488
|
+
</dd>
|
489
|
+
</dl>
|
490
|
+
|
491
|
+
É pressuposto que os templates estarão localizados direto sob o diretório `./views`. Para usar um diretório diferente:
|
492
|
+
|
493
|
+
```ruby
|
494
|
+
set :views, settings.root + '/templates'
|
495
|
+
```
|
365
496
|
|
366
|
-
|
497
|
+
Uma coisa importante para se lembrar é que você sempre deve
|
498
|
+
referenciar os templates utilizando *symbols*, mesmo que
|
499
|
+
eles estejam em um subdiretório (neste caso use:
|
500
|
+
`:'subdir/template'` or `'subdir/template'.to_sym`). Você deve
|
501
|
+
utilizar um *symbol* porque senão o método de renderização irá
|
502
|
+
renderizar qualquer outra string que você passe diretamente
|
503
|
+
para ele
|
367
504
|
|
368
|
-
|
505
|
+
### Literal Templates
|
369
506
|
|
370
507
|
``` ruby
|
371
|
-
# Você precisa do 'require erubis' em sua aplicação.
|
372
|
-
require 'erubis'
|
373
|
-
|
374
508
|
get '/' do
|
375
|
-
|
509
|
+
haml '%div.title Olá Mundo'
|
376
510
|
end
|
377
511
|
```
|
378
512
|
|
379
|
-
Renderiza
|
513
|
+
Renderiza um template string.
|
380
514
|
|
381
|
-
###
|
515
|
+
### Linguagens de template disponíveis
|
382
516
|
|
383
|
-
|
517
|
+
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:
|
384
518
|
|
385
519
|
``` ruby
|
386
|
-
|
387
|
-
|
520
|
+
require 'rdiscount' # ou require 'bluecloth'
|
521
|
+
get('/') { markdown :index }
|
522
|
+
```
|
523
|
+
|
524
|
+
#### Haml Templates
|
525
|
+
|
526
|
+
<table>
|
527
|
+
<tr>
|
528
|
+
<td>Dependencia</td>
|
529
|
+
<td><a href="http://haml.info/" title="haml">haml</a></td>
|
530
|
+
</tr>
|
531
|
+
<tr>
|
532
|
+
<td>Extencao do Arquivo</td>
|
533
|
+
<td><tt>.haml</tt></td>
|
534
|
+
</tr>
|
535
|
+
<tr>
|
536
|
+
<td>Exemplo</td>
|
537
|
+
<td><tt>haml :index, :format => :html5</tt></td>
|
538
|
+
</tr>
|
539
|
+
</table>
|
540
|
+
|
541
|
+
#### Erb Templates
|
542
|
+
|
543
|
+
<table>
|
544
|
+
<tr>
|
545
|
+
<td>Dependencia</td>
|
546
|
+
<td>
|
547
|
+
<a href="http://www.kuwata-lab.com/erubis/" title="erubis">erubis</a>
|
548
|
+
or erb (included in Ruby)
|
549
|
+
</td>
|
550
|
+
</tr>
|
551
|
+
<tr>
|
552
|
+
<td>Extencao do Arquivos</td>
|
553
|
+
<td><tt>.erb</tt>, <tt>.rhtml</tt> or <tt>.erubis</tt> (Erubis only)</td>
|
554
|
+
</tr>
|
555
|
+
<tr>
|
556
|
+
<td>Exemplo</td>
|
557
|
+
<td><tt>erb :index</tt></td>
|
558
|
+
</tr>
|
559
|
+
</table>
|
560
|
+
|
561
|
+
#### Builder Templates
|
562
|
+
|
563
|
+
<table>
|
564
|
+
<tr>
|
565
|
+
<td>Dependencia</td>
|
566
|
+
<td>
|
567
|
+
<a href="https://github.com/jimweirich/builder" title="builder">builder</a>
|
568
|
+
</td>
|
569
|
+
</tr>
|
570
|
+
<tr>
|
571
|
+
<td>Extencao do Arquivo</td>
|
572
|
+
<td><tt>.builder</tt></td>
|
573
|
+
</tr>
|
574
|
+
<tr>
|
575
|
+
<td>Exemplo</td>
|
576
|
+
<td><tt>builder { |xml| xml.em "hi" }</tt></td>
|
577
|
+
</tr>
|
578
|
+
</table>
|
579
|
+
|
580
|
+
It also takes a block for inline templates (see exemplo).
|
581
|
+
|
582
|
+
#### Nokogiri Templates
|
583
|
+
|
584
|
+
<table>
|
585
|
+
<tr>
|
586
|
+
<td>Dependencia</td>
|
587
|
+
<td><a href="http://nokogiri.org/" title="nokogiri">nokogiri</a></td>
|
588
|
+
</tr>
|
589
|
+
<tr>
|
590
|
+
<td>Extencao do Arquivo</td>
|
591
|
+
<td><tt>.nokogiri</tt></td>
|
592
|
+
</tr>
|
593
|
+
<tr>
|
594
|
+
<td>Exemplo</td>
|
595
|
+
<td><tt>nokogiri { |xml| xml.em "hi" }</tt></td>
|
596
|
+
</tr>
|
597
|
+
</table>
|
598
|
+
|
599
|
+
It also takes a block for inline templates (see exemplo).
|
600
|
+
|
601
|
+
#### Sass Templates
|
602
|
+
|
603
|
+
<table>
|
604
|
+
<tr>
|
605
|
+
<td>Dependencia</td>
|
606
|
+
<td><a href="http://sass-lang.com/" title="sass">sass</a></td>
|
607
|
+
</tr>
|
608
|
+
<tr>
|
609
|
+
<td>Extencao do Arquivo</td>
|
610
|
+
<td><tt>.sass</tt></td>
|
611
|
+
</tr>
|
612
|
+
<tr>
|
613
|
+
<td>Exemplo</td>
|
614
|
+
<td><tt>sass :stylesheet, :style => :expanded</tt></td>
|
615
|
+
</tr>
|
616
|
+
</table>
|
617
|
+
|
618
|
+
#### SCSS Templates
|
619
|
+
|
620
|
+
<table>
|
621
|
+
<tr>
|
622
|
+
<td>Dependencia</td>
|
623
|
+
<td><a href="http://sass-lang.com/" title="sass">sass</a></td>
|
624
|
+
</tr>
|
625
|
+
<tr>
|
626
|
+
<td>Extencao do Arquivo</td>
|
627
|
+
<td><tt>.scss</tt></td>
|
628
|
+
</tr>
|
629
|
+
<tr>
|
630
|
+
<td>Exemplo</td>
|
631
|
+
<td><tt>scss :stylesheet, :style => :expanded</tt></td>
|
632
|
+
</tr>
|
633
|
+
</table>
|
634
|
+
|
635
|
+
#### Less Templates
|
636
|
+
|
637
|
+
<table>
|
638
|
+
<tr>
|
639
|
+
<td>Dependencia</td>
|
640
|
+
<td><a href="http://www.lesscss.org/" title="less">less</a></td>
|
641
|
+
</tr>
|
642
|
+
<tr>
|
643
|
+
<td>Extencao do Arquivo</td>
|
644
|
+
<td><tt>.less</tt></td>
|
645
|
+
</tr>
|
646
|
+
<tr>
|
647
|
+
<td>Exemplo</td>
|
648
|
+
<td><tt>less :stylesheet</tt></td>
|
649
|
+
</tr>
|
650
|
+
</table>
|
651
|
+
|
652
|
+
#### Liquid Templates
|
653
|
+
|
654
|
+
<table>
|
655
|
+
<tr>
|
656
|
+
<td>Dependencia</td>
|
657
|
+
<td><a href="http://www.liquidmarkup.org/" title="liquid">liquid</a></td>
|
658
|
+
</tr>
|
659
|
+
<tr>
|
660
|
+
<td>Extencao do Arquivo</td>
|
661
|
+
<td><tt>.liquid</tt></td>
|
662
|
+
</tr>
|
663
|
+
<tr>
|
664
|
+
<td>Exemplo</td>
|
665
|
+
<td><tt>liquid :index, :locals => { :key => 'value' }</tt></td>
|
666
|
+
</tr>
|
667
|
+
</table>
|
668
|
+
|
669
|
+
Já que você não pode chamar o Ruby (exceto pelo método `yield`) pelo template Liquid,
|
670
|
+
você quase sempre precisará passar o `locals` para ele.
|
671
|
+
|
672
|
+
#### Markdown Templates
|
673
|
+
|
674
|
+
<table>
|
675
|
+
<tr>
|
676
|
+
<td>Dependencia</td>
|
677
|
+
<td>
|
678
|
+
Anyone of:
|
679
|
+
<a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
|
680
|
+
<a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
|
681
|
+
<a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
|
682
|
+
<a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
|
683
|
+
<a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
|
684
|
+
</td>
|
685
|
+
</tr>
|
686
|
+
<tr>
|
687
|
+
<td>Extencao do Arquivos</td>
|
688
|
+
<td><tt>.markdown</tt>, <tt>.mkd</tt> and <tt>.md</tt></td>
|
689
|
+
</tr>
|
690
|
+
<tr>
|
691
|
+
<td>Exemplo</td>
|
692
|
+
<td><tt>markdown :index, :layout_engine => :erb</tt></td>
|
693
|
+
</tr>
|
694
|
+
</table>
|
695
|
+
|
696
|
+
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:
|
388
697
|
|
389
|
-
|
390
|
-
|
391
|
-
builder :index
|
392
|
-
end
|
698
|
+
``` ruby
|
699
|
+
erb :overview, :locals => { :text => markdown(:introducao) }
|
393
700
|
```
|
394
701
|
|
395
|
-
|
702
|
+
Note que vcoê também pode chamar o método `markdown` dentro de outros templates:
|
396
703
|
|
397
|
-
|
704
|
+
``` ruby
|
705
|
+
%h1 Olá do Haml!
|
706
|
+
%p= markdown(:saudacoes)
|
707
|
+
```
|
708
|
+
|
709
|
+
Já que você não pode chamar o Ruby pelo Markdown, você não
|
710
|
+
pode utilizar um layout escrito em Markdown. Contudo é
|
711
|
+
possível utilizar outra engine de renderização como template,
|
712
|
+
deve-se passar a `:layout_engine` como opção.
|
713
|
+
|
714
|
+
<table>
|
715
|
+
<tr>
|
716
|
+
<td>Dependencia</td>
|
717
|
+
<td><a href="http://redcloth.org/" title="RedCloth">RedCloth</a></td>
|
718
|
+
</tr>
|
719
|
+
<tr>
|
720
|
+
<td>Extencao do Arquivo</td>
|
721
|
+
<td><tt>.textile</tt></td>
|
722
|
+
</tr>
|
723
|
+
<tr>
|
724
|
+
<td>Exemplo</td>
|
725
|
+
<td><tt>textile :index, :layout_engine => :erb</tt></td>
|
726
|
+
</tr>
|
727
|
+
</table>
|
728
|
+
|
729
|
+
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:
|
398
730
|
|
399
|
-
|
731
|
+
``` ruby
|
732
|
+
erb :overview, :locals => { :text => textile(:introducao) }
|
733
|
+
```
|
734
|
+
|
735
|
+
Note que vcoê também pode chamar o método `textile` dentro de outros templates:
|
400
736
|
|
401
737
|
``` ruby
|
402
|
-
|
403
|
-
|
738
|
+
%h1 Olá do Haml!
|
739
|
+
%p= textile(:saudacoes)
|
740
|
+
```
|
741
|
+
|
742
|
+
Já que você não pode chamar o Ruby pelo Textile, você não
|
743
|
+
pode utilizar um layout escrito em Textile. Contudo é
|
744
|
+
possível utilizar outra engine de renderização como template,
|
745
|
+
deve-se passar a `:layout_engine` como opção.
|
746
|
+
|
747
|
+
#### RDoc Templates
|
748
|
+
|
749
|
+
<table>
|
750
|
+
<tr>
|
751
|
+
<td>Dependencia</td>
|
752
|
+
<td><a href="http://rdoc.sourceforge.net/" title="RDoc">RDoc</a></td>
|
753
|
+
</tr>
|
754
|
+
<tr>
|
755
|
+
<td>Extencao do Arquivo</td>
|
756
|
+
<td><tt>.rdoc</tt></td>
|
757
|
+
</tr>
|
758
|
+
<tr>
|
759
|
+
<td>Exemplo</td>
|
760
|
+
<td><tt>rdoc :README, :layout_engine => :erb</tt></td>
|
761
|
+
</tr>
|
762
|
+
</table>
|
763
|
+
|
764
|
+
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:
|
404
765
|
|
405
|
-
|
406
|
-
|
407
|
-
sass :stylesheet
|
408
|
-
end
|
766
|
+
``` ruby
|
767
|
+
erb :overview, :locals => { :text => rdoc(:introducao) }
|
409
768
|
```
|
410
769
|
|
411
|
-
|
412
|
-
|
413
|
-
[Opções
|
414
|
-
Sass](http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options)
|
415
|
-
podem ser setadas globalmente através das configurações do sinatra, veja
|
416
|
-
[Opções e Configurações](http://www.sinatrarb.com/configuration.html), e
|
417
|
-
substitua em uma requisição individual.
|
770
|
+
Note que vcoê também pode chamar o método `rdoc` dentro de outros templates:
|
418
771
|
|
419
772
|
``` ruby
|
420
|
-
|
773
|
+
%h1 Olá do Haml!
|
774
|
+
%p= rdoc(:saudacoes)
|
775
|
+
```
|
776
|
+
|
777
|
+
Já que você não pode chamar o Ruby pelo RDoc, você não
|
778
|
+
pode utilizar um layout escrito em RDoc. Contudo é
|
779
|
+
possível utilizar outra engine de renderização como template,
|
780
|
+
deve-se passar a `:layout_engine` como opção.
|
781
|
+
|
782
|
+
#### AsciiDoc Templates
|
783
|
+
|
784
|
+
<table>
|
785
|
+
<tr>
|
786
|
+
<td>Dependencia</td>
|
787
|
+
<td><a href="http://asciidoctor.org/" title="Asciidoctor">Asciidoctor</a></td>
|
788
|
+
</tr>
|
789
|
+
<tr>
|
790
|
+
<td>Extencao do Arquivo</td>
|
791
|
+
<td><tt>.asciidoc</tt>, <tt>.adoc</tt> and <tt>.ad</tt></td>
|
792
|
+
</tr>
|
793
|
+
<tr>
|
794
|
+
<td>Exemplo</td>
|
795
|
+
<td><tt>asciidoc :README, :layout_engine => :erb</tt></td>
|
796
|
+
</tr>
|
797
|
+
</table>
|
798
|
+
|
799
|
+
Já que você não pode chamar o Ruby pelo template AsciiDoc,
|
800
|
+
você quase sempre precisará passar o `locals` para ele.
|
801
|
+
|
802
|
+
#### Radius Templates
|
803
|
+
|
804
|
+
<table>
|
805
|
+
<tr>
|
806
|
+
<td>Dependencia</td>
|
807
|
+
<td><a href="https://github.com/jlong/radius" title="Radius">Radius</a></td>
|
808
|
+
</tr>
|
809
|
+
<tr>
|
810
|
+
<td>Extencao do Arquivo</td>
|
811
|
+
<td><tt>.radius</tt></td>
|
812
|
+
</tr>
|
813
|
+
<tr>
|
814
|
+
<td>Exemplo</td>
|
815
|
+
<td><tt>radius :index, :locals => { :key => 'value' }</tt></td>
|
816
|
+
</tr>
|
817
|
+
</table>
|
818
|
+
|
819
|
+
Já que você não pode chamar o Ruby pelo template Radius,
|
820
|
+
você quase sempre precisará passar o `locals` para ele.
|
821
|
+
|
822
|
+
#### Markaby Templates
|
823
|
+
|
824
|
+
<table>
|
825
|
+
<tr>
|
826
|
+
<td>Dependencia</td>
|
827
|
+
<td><a href="http://markaby.github.com/" title="Markaby">Markaby</a></td>
|
828
|
+
</tr>
|
829
|
+
<tr>
|
830
|
+
<td>Extencao do Arquivo</td>
|
831
|
+
<td><tt>.mab</tt></td>
|
832
|
+
</tr>
|
833
|
+
<tr>
|
834
|
+
<td>Exemplo</td>
|
835
|
+
<td><tt>markaby { h1 "Welcome!" }</tt></td>
|
836
|
+
</tr>
|
837
|
+
</table>
|
838
|
+
|
839
|
+
Este também recebe um bloco para templates (veja o exemplo).
|
840
|
+
|
841
|
+
#### RABL Templates
|
842
|
+
|
843
|
+
<table>
|
844
|
+
<tr>
|
845
|
+
<td>Dependencia</td>
|
846
|
+
<td><a href="https://github.com/nesquena/rabl" title="Rabl">Rabl</a></td>
|
847
|
+
</tr>
|
848
|
+
<tr>
|
849
|
+
<td>Extencao do Arquivo</td>
|
850
|
+
<td><tt>.rabl</tt></td>
|
851
|
+
</tr>
|
852
|
+
<tr>
|
853
|
+
<td>Exemplo</td>
|
854
|
+
<td><tt>rabl :index</tt></td>
|
855
|
+
</tr>
|
856
|
+
</table>
|
857
|
+
|
858
|
+
#### Slim Templates
|
859
|
+
|
860
|
+
<table>
|
861
|
+
<tr>
|
862
|
+
<td>Dependencia</td>
|
863
|
+
<td><a href="http://slim-lang.com/" title="Slim Lang">Slim Lang</a></td>
|
864
|
+
</tr>
|
865
|
+
<tr>
|
866
|
+
<td>Extencao do Arquivo</td>
|
867
|
+
<td><tt>.slim</tt></td>
|
868
|
+
</tr>
|
869
|
+
<tr>
|
870
|
+
<td>Exemplo</td>
|
871
|
+
<td><tt>slim :index</tt></td>
|
872
|
+
</tr>
|
873
|
+
</table>
|
874
|
+
|
875
|
+
#### Creole Templates
|
876
|
+
|
877
|
+
<table>
|
878
|
+
<tr>
|
879
|
+
<td>Dependencia</td>
|
880
|
+
<td><a href="https://github.com/minad/creole" title="Creole">Creole</a></td>
|
881
|
+
</tr>
|
882
|
+
<tr>
|
883
|
+
<td>Extencao do Arquivo</td>
|
884
|
+
<td><tt>.creole</tt></td>
|
885
|
+
</tr>
|
886
|
+
<tr>
|
887
|
+
<td>Exemplo</td>
|
888
|
+
<td><tt>creole :wiki, :layout_engine => :erb</tt></td>
|
889
|
+
</tr>
|
890
|
+
</table>
|
891
|
+
|
892
|
+
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:
|
421
893
|
|
422
|
-
|
423
|
-
|
424
|
-
sass :stylesheet, :style => :expanded # substituido
|
425
|
-
end
|
894
|
+
``` ruby
|
895
|
+
erb :overview, :locals => { :text => creole(:introduction) }
|
426
896
|
```
|
427
897
|
|
428
|
-
|
429
|
-
|
430
|
-
A gem/biblioteca less é necessária para renderizar templates Less:
|
898
|
+
Note que vcoê também pode chamar o método `creole` dentro de outros templates:
|
431
899
|
|
432
900
|
``` ruby
|
433
|
-
|
434
|
-
|
901
|
+
%h1 Olá do Haml!
|
902
|
+
%p= creole(:saudacoes)
|
903
|
+
```
|
904
|
+
|
905
|
+
Já que você não pode chamar o Ruby pelo Creole, você não
|
906
|
+
pode utilizar um layout escrito em Creole. Contudo é
|
907
|
+
possível utilizar outra engine de renderização como template,
|
908
|
+
deve-se passar a `:layout_engine` como opção.
|
909
|
+
|
910
|
+
#### MediaWiki Templates
|
911
|
+
|
912
|
+
<table>
|
913
|
+
<tr>
|
914
|
+
<td>Dependencia</td>
|
915
|
+
<td><a href="https://github.com/nricciar/wikicloth" title="WikiCloth">WikiCloth</a></td>
|
916
|
+
</tr>
|
917
|
+
<tr>
|
918
|
+
<td>Extencao do Arquivo</td>
|
919
|
+
<td><tt>.mediawiki</tt> and <tt>.mw</tt></td>
|
920
|
+
</tr>
|
921
|
+
<tr>
|
922
|
+
<td>Exemplo</td>
|
923
|
+
<td><tt>mediawiki :wiki, :layout_engine => :erb</tt></td>
|
924
|
+
</tr>
|
925
|
+
</table>
|
926
|
+
|
927
|
+
It is not possible to call methods from MediaWiki markup, nor to pass locals to
|
928
|
+
it. You therefore will usually use it in combination with another rendering
|
929
|
+
engine:
|
435
930
|
|
436
|
-
|
437
|
-
|
438
|
-
less :stylesheet
|
439
|
-
end
|
931
|
+
``` ruby
|
932
|
+
erb :overview, :locals => { :text => mediawiki(:introduction) }
|
440
933
|
```
|
441
934
|
|
442
|
-
|
935
|
+
Note that you may also call the `mediawiki` method from within other templates:
|
443
936
|
|
444
|
-
|
937
|
+
``` ruby
|
938
|
+
%h1 Hello From Haml!
|
939
|
+
%p= mediawiki(:greetings)
|
940
|
+
```
|
941
|
+
|
942
|
+
Já que você não pode chamar o Ruby pelo MediaWiki, você não
|
943
|
+
pode utilizar um layout escrito em MediaWiki. Contudo é
|
944
|
+
possível utilizar outra engine de renderização como template,
|
945
|
+
deve-se passar a `:layout_engine` como opção.
|
946
|
+
|
947
|
+
#### CoffeeScript Templates
|
948
|
+
|
949
|
+
<table>
|
950
|
+
<tr>
|
951
|
+
<td>Dependencia</td>
|
952
|
+
<td>
|
953
|
+
<a href="https://github.com/josh/ruby-coffee-script" title="Ruby CoffeeScript">
|
954
|
+
CoffeeScript
|
955
|
+
</a> and a
|
956
|
+
<a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
|
957
|
+
way to execute javascript
|
958
|
+
</a>
|
959
|
+
</td>
|
960
|
+
</tr>
|
961
|
+
<tr>
|
962
|
+
<td>Extencao do Arquivo</td>
|
963
|
+
<td><tt>.coffee</tt></td>
|
964
|
+
</tr>
|
965
|
+
<tr>
|
966
|
+
<td>Exemplo</td>
|
967
|
+
<td><tt>coffee :index</tt></td>
|
968
|
+
</tr>
|
969
|
+
</table>
|
970
|
+
|
971
|
+
#### Stylus Templates
|
972
|
+
|
973
|
+
<table>
|
974
|
+
<tr>
|
975
|
+
<td>Dependencia</td>
|
976
|
+
<td>
|
977
|
+
<a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
|
978
|
+
Stylus
|
979
|
+
</a> and a
|
980
|
+
<a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
|
981
|
+
way to execute javascript
|
982
|
+
</a>
|
983
|
+
</td>
|
984
|
+
</tr>
|
985
|
+
<tr>
|
986
|
+
<td>Extencao do Arquivo</td>
|
987
|
+
<td><tt>.styl</tt></td>
|
988
|
+
</tr>
|
989
|
+
<tr>
|
990
|
+
<td>Exemplo</td>
|
991
|
+
<td><tt>stylus :index</tt></td>
|
992
|
+
</tr>
|
993
|
+
</table>
|
994
|
+
|
995
|
+
Antes que vcoê possa utilizar o template Stylus primeiro você deve carregar `stylus` e `stylus/tilt`:
|
445
996
|
|
446
997
|
``` ruby
|
998
|
+
require 'sinatra'
|
999
|
+
require 'stylus'
|
1000
|
+
require 'stylus/tilt'
|
1001
|
+
|
447
1002
|
get '/' do
|
448
|
-
|
449
|
-
end
|
1003
|
+
stylus :exemplo
|
1004
|
+
end
|
1005
|
+
```
|
1006
|
+
|
1007
|
+
#### Yajl Templates
|
1008
|
+
|
1009
|
+
<table>
|
1010
|
+
<tr>
|
1011
|
+
<td>Dependencia</td>
|
1012
|
+
<td><a href="https://github.com/brianmario/yajl-ruby" title="yajl-ruby">yajl-ruby</a></td>
|
1013
|
+
</tr>
|
1014
|
+
<tr>
|
1015
|
+
<td>Extencao do Arquivo</td>
|
1016
|
+
<td><tt>.yajl</tt></td>
|
1017
|
+
</tr>
|
1018
|
+
<tr>
|
1019
|
+
<td>Exemplo</td>
|
1020
|
+
<td>
|
1021
|
+
<tt>
|
1022
|
+
yajl :index,
|
1023
|
+
:locals => { :key => 'qux' },
|
1024
|
+
:callback => 'present',
|
1025
|
+
:variable => 'resource'
|
1026
|
+
</tt>
|
1027
|
+
</td>
|
1028
|
+
</tr>
|
1029
|
+
</table>
|
1030
|
+
|
1031
|
+
O código-fonte do template é executado como uma string Ruby e a variável resultante em json é convertida utilizando `#to_json`:
|
1032
|
+
|
1033
|
+
``` ruby
|
1034
|
+
json = { :foo => 'bar' }
|
1035
|
+
json[:baz] = key
|
450
1036
|
```
|
451
1037
|
|
452
|
-
|
1038
|
+
O `:callback` e `:variable` são opções que podem ser utilizadas para o objeto de renderização:
|
1039
|
+
|
1040
|
+
``` javascript
|
1041
|
+
var resource = {"foo":"bar","baz":"qux"};
|
1042
|
+
present(resource);
|
1043
|
+
```
|
453
1044
|
|
454
|
-
|
1045
|
+
#### WLang Templates
|
1046
|
+
|
1047
|
+
<table>
|
1048
|
+
<tr>
|
1049
|
+
<td>Dependencia</td>
|
1050
|
+
<td><a href="https://github.com/blambeau/wlang/" title="WLang">WLang</a></td>
|
1051
|
+
</tr>
|
1052
|
+
<tr>
|
1053
|
+
<td>Extencao do Arquivo</td>
|
1054
|
+
<td><tt>.wlang</tt></td>
|
1055
|
+
</tr>
|
1056
|
+
<tr>
|
1057
|
+
<td>Exemplo</td>
|
1058
|
+
<td><tt>wlang :index, :locals => { :key => 'value' }</tt></td>
|
1059
|
+
</tr>
|
1060
|
+
</table>
|
1061
|
+
|
1062
|
+
Já que você não pode chamar o Ruby (exceto pelo método
|
1063
|
+
`yield`) pelo template WLang,
|
1064
|
+
você quase sempre precisará passar o `locals` para ele.
|
1065
|
+
|
1066
|
+
## Acessando Variáveis nos Templates
|
455
1067
|
|
456
1068
|
Templates são avaliados dentro do mesmo contexto como manipuladores de
|
457
1069
|
rota. Variáveis de instância setadas em rotas manipuladas são
|
@@ -459,7 +1071,7 @@ diretamente acessadas por templates:
|
|
459
1071
|
|
460
1072
|
``` ruby
|
461
1073
|
get '/:id' do
|
462
|
-
@foo = Foo.find(params[
|
1074
|
+
@foo = Foo.find(params['id'])
|
463
1075
|
haml '%h1= @foo.nome'
|
464
1076
|
end
|
465
1077
|
```
|
@@ -468,7 +1080,7 @@ Ou, especifique um hash explícito para variáveis locais:
|
|
468
1080
|
|
469
1081
|
``` ruby
|
470
1082
|
get '/:id' do
|
471
|
-
foo = Foo.find(params[
|
1083
|
+
foo = Foo.find(params['id'])
|
472
1084
|
haml '%h1= foo.nome', :locals => { :foo => foo }
|
473
1085
|
end
|
474
1086
|
```
|
@@ -476,12 +1088,45 @@ end
|
|
476
1088
|
Isso é tipicamente utilizando quando renderizamos templates como
|
477
1089
|
partials dentro de outros templates.
|
478
1090
|
|
1091
|
+
### Templates com `yield` e layouts aninhados
|
1092
|
+
|
1093
|
+
O layout geralmente é apenas um template que executa `yield`.
|
1094
|
+
Tal template pode ser utilizado pela opção `:template` descrita acima ou pode ser renderizado através de um bloco, como a seguir:
|
1095
|
+
|
1096
|
+
``` ruby
|
1097
|
+
erb :post, :layout => false do
|
1098
|
+
erb :index
|
1099
|
+
end
|
1100
|
+
```
|
1101
|
+
|
1102
|
+
Este código é quase equivalente a `erb :index, :layout => :post`
|
1103
|
+
|
1104
|
+
Passando blocos para os métodos de renderização é útil para criar layouts aninhados:
|
1105
|
+
|
1106
|
+
``` ruby
|
1107
|
+
erb :main_layout, :layout => false do
|
1108
|
+
erb :admin_layout do
|
1109
|
+
erb :user
|
1110
|
+
end
|
1111
|
+
end
|
1112
|
+
```
|
1113
|
+
|
1114
|
+
Também pode ser feito com menos linhas de código:
|
1115
|
+
|
1116
|
+
``` ruby
|
1117
|
+
erb :admin_layout, :layout => :main_layout do
|
1118
|
+
erb :user
|
1119
|
+
end
|
1120
|
+
```
|
1121
|
+
|
1122
|
+
Atualmente os métodos listados aceitam blocos: `erb`, `haml`,
|
1123
|
+
`liquid`, `slim `, `wlang`. E também o método `render`.
|
1124
|
+
|
479
1125
|
### Templates Inline
|
480
1126
|
|
481
1127
|
Templates podem ser definidos no final do arquivo fonte(.rb):
|
482
1128
|
|
483
1129
|
``` ruby
|
484
|
-
require 'rubygems'
|
485
1130
|
require 'sinatra'
|
486
1131
|
|
487
1132
|
get '/' do
|
@@ -495,7 +1140,7 @@ __END__
|
|
495
1140
|
= yield
|
496
1141
|
|
497
1142
|
@@ index
|
498
|
-
%div.title Olá Mundo
|
1143
|
+
%div.title Olá Mundo.
|
499
1144
|
```
|
500
1145
|
|
501
1146
|
NOTA: Templates inline definidos no arquivo fonte são automaticamente
|
@@ -531,27 +1176,53 @@ get '/' do
|
|
531
1176
|
end
|
532
1177
|
```
|
533
1178
|
|
534
|
-
|
1179
|
+
### Associando extensões de arquivos
|
535
1180
|
|
536
|
-
|
537
|
-
|
1181
|
+
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:
|
1182
|
+
|
1183
|
+
``` ruby
|
1184
|
+
Tilt.register :tt, Tilt[:textile]
|
1185
|
+
```
|
1186
|
+
|
1187
|
+
### Adicionando seu Próprio Engine de Template
|
1188
|
+
|
1189
|
+
Primeiro registre seu engine utilizando o Tilt, e então crie um método de renderização:
|
538
1190
|
|
539
1191
|
``` ruby
|
1192
|
+
Tilt.register :myat, MyAwesomeTemplateEngine
|
1193
|
+
|
540
1194
|
helpers do
|
541
|
-
def
|
542
|
-
"#{nome}bar"
|
543
|
-
end
|
1195
|
+
def myat(*args) render(:myat, *args) end
|
544
1196
|
end
|
545
1197
|
|
546
|
-
get '
|
547
|
-
|
1198
|
+
get '/' do
|
1199
|
+
myat :index
|
1200
|
+
end
|
1201
|
+
```
|
1202
|
+
|
1203
|
+
Renderize `./views/index.myat`. Veja
|
1204
|
+
https://github.com/rtomayko/tilt para saber mais sobre Tilt.
|
1205
|
+
|
1206
|
+
### Customizando lógica para encontrar templates
|
1207
|
+
|
1208
|
+
Para implementar sua própria lógica para busca de templates você pode escrever seu próprio método `#find_template`
|
1209
|
+
|
1210
|
+
``` ruby
|
1211
|
+
configure do
|
1212
|
+
set :views [ './views/a', './views/b' ]
|
1213
|
+
end
|
1214
|
+
|
1215
|
+
def find_template(views, name, engine, &block)
|
1216
|
+
Array(views).each do |v|
|
1217
|
+
super(v, name, engine, &block)
|
1218
|
+
end
|
548
1219
|
end
|
549
1220
|
```
|
550
1221
|
|
551
1222
|
## Filtros
|
552
1223
|
|
553
1224
|
Filtros Before são avaliados antes de cada requisição dentro do contexto
|
554
|
-
da requisição e
|
1225
|
+
da requisição e podem modificar a requisição e a reposta. Variáveis de
|
555
1226
|
instância setadas nos filtros são acessadas através de rotas e
|
556
1227
|
templates:
|
557
1228
|
|
@@ -563,13 +1234,13 @@ end
|
|
563
1234
|
|
564
1235
|
get '/foo/*' do
|
565
1236
|
@nota #=> 'Oi!'
|
566
|
-
params[
|
1237
|
+
params['splat'] #=> 'bar/baz'
|
567
1238
|
end
|
568
1239
|
```
|
569
1240
|
|
570
1241
|
Filtros After são avaliados após cada requisição dentro do contexto da
|
571
|
-
requisição e também podem modificar
|
572
|
-
instância definidas nos filtros before
|
1242
|
+
requisição e também podem modificar a requisição e a resposta. Variáveis de
|
1243
|
+
instância e rotas definidas nos filtros before são acessadas através dos
|
573
1244
|
filtros after:
|
574
1245
|
|
575
1246
|
``` ruby
|
@@ -578,7 +1249,7 @@ after do
|
|
578
1249
|
end
|
579
1250
|
```
|
580
1251
|
|
581
|
-
Filtros opcionalmente
|
1252
|
+
Filtros opcionalmente têm um padrão, fazendo com que sejam avaliados
|
582
1253
|
somente se o caminho do pedido coincidir com esse padrão:
|
583
1254
|
|
584
1255
|
``` ruby
|
@@ -591,7 +1262,72 @@ after '/create/:slug' do |slug|
|
|
591
1262
|
end
|
592
1263
|
```
|
593
1264
|
|
594
|
-
##
|
1265
|
+
## Helpers
|
1266
|
+
|
1267
|
+
Use o método de alto nível `helpers` para definir métodos auxiliares
|
1268
|
+
para utilizar em manipuladores de rotas e modelos:
|
1269
|
+
|
1270
|
+
``` ruby
|
1271
|
+
helpers do
|
1272
|
+
def bar(nome)
|
1273
|
+
"#{nome}bar"
|
1274
|
+
end
|
1275
|
+
end
|
1276
|
+
|
1277
|
+
get '/:nome' do
|
1278
|
+
bar(params['nome'])
|
1279
|
+
end
|
1280
|
+
```
|
1281
|
+
|
1282
|
+
### Utilizando Sessões
|
1283
|
+
|
1284
|
+
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:
|
1285
|
+
|
1286
|
+
``` ruby
|
1287
|
+
enable :sessions
|
1288
|
+
|
1289
|
+
get '/' do
|
1290
|
+
"value = " << session[:value].inspect
|
1291
|
+
end
|
1292
|
+
|
1293
|
+
get '/:value' do
|
1294
|
+
session['value'] = params['value']
|
1295
|
+
end
|
1296
|
+
```
|
1297
|
+
|
1298
|
+
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:
|
1299
|
+
|
1300
|
+
``` ruby
|
1301
|
+
use Rack::Session::Pool, :expire_after => 2592000
|
1302
|
+
|
1303
|
+
get '/' do
|
1304
|
+
"value = " << session[:value].inspect
|
1305
|
+
end
|
1306
|
+
|
1307
|
+
get '/:value' do
|
1308
|
+
session['value'] = params['value']
|
1309
|
+
end
|
1310
|
+
```
|
1311
|
+
|
1312
|
+
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:
|
1313
|
+
|
1314
|
+
``` ruby
|
1315
|
+
set :session_secret, 'super secret'
|
1316
|
+
```
|
1317
|
+
|
1318
|
+
Se você quiser fazer outras configurações, você também pode guardar um hash com as opções nas configurações da `session`:
|
1319
|
+
|
1320
|
+
``` ruby
|
1321
|
+
set :sessions, :domain => 'foo.com'
|
1322
|
+
```
|
1323
|
+
|
1324
|
+
Para compartilhar sua sessão entre outros aplicativos em um subdomínio de foo.com, utilize o prefixo *.*:
|
1325
|
+
|
1326
|
+
``` ruby
|
1327
|
+
set :sessions, :domain => '.foo.com'
|
1328
|
+
```
|
1329
|
+
|
1330
|
+
### Halting
|
595
1331
|
|
596
1332
|
Para parar imediatamente uma requisição com um filtro ou rota utilize:
|
597
1333
|
|
@@ -623,14 +1359,20 @@ Com cabeçalhos…
|
|
623
1359
|
halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
|
624
1360
|
```
|
625
1361
|
|
626
|
-
|
1362
|
+
É obviamente possivel combinar um template com o `halt`:
|
1363
|
+
|
1364
|
+
``` ruby
|
1365
|
+
halt erb(:error)
|
1366
|
+
```
|
1367
|
+
|
1368
|
+
### Passing
|
627
1369
|
|
628
1370
|
Uma rota pode processar aposta para a próxima rota correspondente usando
|
629
1371
|
`pass`:
|
630
1372
|
|
631
1373
|
``` ruby
|
632
1374
|
get '/adivinhar/:quem' do
|
633
|
-
pass unless params[
|
1375
|
+
pass unless params['quem'] == 'Frank'
|
634
1376
|
'Você me pegou!'
|
635
1377
|
end
|
636
1378
|
|
@@ -643,6 +1385,27 @@ O bloqueio da rota é imediatamente encerrado e o controle continua com a
|
|
643
1385
|
próxima rota de parâmetro. Se o parâmetro da rota não for encontrado, um
|
644
1386
|
404 é retornado.
|
645
1387
|
|
1388
|
+
### Desencadeando Outra Rota
|
1389
|
+
|
1390
|
+
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:
|
1391
|
+
|
1392
|
+
``` ruby
|
1393
|
+
get '/foo' do
|
1394
|
+
status, headers, body = call env.merge("PATH_INFO" => '/bar')
|
1395
|
+
[status, headers, body.map(&:upcase)]
|
1396
|
+
end
|
1397
|
+
|
1398
|
+
get '/bar' do
|
1399
|
+
"bar"
|
1400
|
+
end
|
1401
|
+
```
|
1402
|
+
|
1403
|
+
Note que no exemplo acima você ganharia performance ao simplemente mover o `"bar"` em um helper usado por ambos `/foo` e `/bar`.
|
1404
|
+
|
1405
|
+
Se você quer que a requisição seja enviada para a mesma instancia da aplicação ao invês de uma duplicada, use `call!` no lugar de `call`.
|
1406
|
+
|
1407
|
+
Veja a especificação do Rack se você quer aprender mais sobre o `call`.
|
1408
|
+
|
646
1409
|
## Configuração
|
647
1410
|
|
648
1411
|
Rodando uma vez, na inicialização, em qualquer ambiente:
|
@@ -679,7 +1442,7 @@ oferecer, como `haml`, `erb`, `halt`, etc.
|
|
679
1442
|
### Não Encontrado
|
680
1443
|
|
681
1444
|
Quando um `Sinatra::NotFound` exception é levantado, ou o código de
|
682
|
-
status da reposta é 404, o `not_found`
|
1445
|
+
status da reposta é 404, o manipulador `not_found` é invocado:
|
683
1446
|
|
684
1447
|
``` ruby
|
685
1448
|
not_found do
|
@@ -695,7 +1458,7 @@ obtido a partir da variável Rack `sinatra.error`:
|
|
695
1458
|
|
696
1459
|
``` ruby
|
697
1460
|
error do
|
698
|
-
'Desculpe, houve um erro desagradável - ' + env['sinatra.error'].
|
1461
|
+
'Desculpe, houve um erro desagradável - ' + env['sinatra.error'].message
|
699
1462
|
end
|
700
1463
|
```
|
701
1464
|
|
@@ -759,9 +1522,9 @@ Você também pode utilizar isto com o helper `content_type`:
|
|
759
1522
|
content_type :foo
|
760
1523
|
```
|
761
1524
|
|
762
|
-
## Middleware
|
1525
|
+
## Rack Middleware
|
763
1526
|
|
764
|
-
O Sinatra roda no [Rack](http://rack.
|
1527
|
+
O Sinatra roda no [Rack](http://rack.github.io/), uma interface
|
765
1528
|
padrão mínima para frameworks web em Ruby. Um das capacidades mais
|
766
1529
|
interessantes do Rack para desenvolver aplicativos é suporte a
|
767
1530
|
“middleware” – componentes que ficam entre o servidor e sua aplicação
|
@@ -784,7 +1547,7 @@ end
|
|
784
1547
|
```
|
785
1548
|
|
786
1549
|
A semântica de `use` é idêntica aquela definida para a DSL
|
787
|
-
[Rack::Builder](http://
|
1550
|
+
[Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder)
|
788
1551
|
(mais frequentemente utilizada para arquivos rackup). Por exemplo, o
|
789
1552
|
método `use` aceita múltiplos argumentos/variáveis bem como blocos:
|
790
1553
|
|
@@ -809,7 +1572,7 @@ framework de teste baseados no Rack.
|
|
809
1572
|
require 'minha_aplicacao_sinatra'
|
810
1573
|
require 'rack/test'
|
811
1574
|
|
812
|
-
class MinhaAplicacaoTeste < Test
|
1575
|
+
class MinhaAplicacaoTeste < Minitest::Test
|
813
1576
|
include Rack::Test::Methods
|
814
1577
|
|
815
1578
|
def app
|
@@ -949,17 +1712,15 @@ git pull
|
|
949
1712
|
|
950
1713
|
## Mais
|
951
1714
|
|
952
|
-
|
1715
|
+
* [Website do Projeto](http://www.sinatrarb.com/) - Documentação
|
953
1716
|
adicional, novidades e links para outros recursos.
|
954
|
-
|
955
|
-
- [Contribuir](http://www.sinatrarb.com/contributing) - Encontrar um
|
1717
|
+
* [Contribuir](http://www.sinatrarb.com/contributing) - Encontrar um
|
956
1718
|
bug? Precisa de ajuda? Tem um patch?
|
957
|
-
|
958
|
-
|
959
|
-
|
960
|
-
|
961
|
-
|
962
|
-
|
963
|
-
|
964
|
-
- [IRC: \#sinatra](irc://chat.freenode.net/#sinatra) em
|
1719
|
+
* [Acompanhar Questões](http://github.com/sinatra/sinatra/issues)
|
1720
|
+
* [Twitter](http://twitter.com/sinatra)
|
1721
|
+
* [Lista de Email](http://groups.google.com/group/sinatrarb/topics)
|
1722
|
+
* [Sinatra Book](https://github.com/sinatra/sinatra-book/) Livro de Receitas
|
1723
|
+
* Documentação da API para a [última release](http://rubydoc.info/gems/sinatra)
|
1724
|
+
* [IRC: \#sinatra](irc://chat.freenode.net/#sinatra) em
|
965
1725
|
[freenode.net](http://freenode.net)
|
1726
|
+
* [Servidor de CI](http://travis-ci.org/sinatra/sinatra)
|