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.

Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHORS.md +77 -0
  3. data/CHANGES +30 -0
  4. data/Gemfile +5 -5
  5. data/README.de.md +186 -56
  6. data/README.es.md +76 -76
  7. data/README.fr.md +120 -56
  8. data/README.hu.md +19 -19
  9. data/README.ja.md +44 -46
  10. data/README.ko.md +163 -67
  11. data/README.md +151 -127
  12. data/README.pt-br.md +905 -144
  13. data/README.pt-pt.md +17 -17
  14. data/README.ru.md +88 -52
  15. data/README.zh.md +76 -68
  16. data/lib/sinatra.rb +0 -1
  17. data/lib/sinatra/base.rb +21 -15
  18. data/lib/sinatra/show_exceptions.rb +10 -4
  19. data/lib/sinatra/version.rb +1 -1
  20. data/sinatra.gemspec +1 -1
  21. data/test/asciidoctor_test.rb +2 -2
  22. data/test/base_test.rb +1 -5
  23. data/test/builder_test.rb +2 -2
  24. data/test/coffee_test.rb +8 -2
  25. data/test/compile_test.rb +1 -1
  26. data/test/contest.rb +3 -12
  27. data/test/creole_test.rb +2 -2
  28. data/test/delegator_test.rb +1 -1
  29. data/test/encoding_test.rb +1 -1
  30. data/test/erb_test.rb +1 -1
  31. data/test/extensions_test.rb +1 -1
  32. data/test/filter_test.rb +2 -2
  33. data/test/haml_test.rb +2 -2
  34. data/test/helper.rb +8 -7
  35. data/test/helpers_test.rb +6 -6
  36. data/test/integration_test.rb +3 -3
  37. data/test/less_test.rb +2 -2
  38. data/test/liquid_test.rb +3 -3
  39. data/test/mapped_error_test.rb +5 -5
  40. data/test/markaby_test.rb +2 -2
  41. data/test/markdown_test.rb +6 -3
  42. data/test/mediawiki_test.rb +2 -2
  43. data/test/middleware_test.rb +1 -1
  44. data/test/nokogiri_test.rb +2 -2
  45. data/test/rabl_test.rb +2 -2
  46. data/test/rack_test.rb +1 -1
  47. data/test/radius_test.rb +2 -2
  48. data/test/rdoc_test.rb +4 -4
  49. data/test/readme_test.rb +1 -1
  50. data/test/request_test.rb +4 -1
  51. data/test/response_test.rb +1 -1
  52. data/test/result_test.rb +2 -2
  53. data/test/route_added_hook_test.rb +1 -1
  54. data/test/routing_test.rb +7 -7
  55. data/test/sass_test.rb +3 -3
  56. data/test/scss_test.rb +2 -2
  57. data/test/server_test.rb +10 -2
  58. data/test/settings_test.rb +4 -4
  59. data/test/sinatra_test.rb +1 -1
  60. data/test/slim_test.rb +2 -2
  61. data/test/static_test.rb +2 -2
  62. data/test/streaming_test.rb +2 -2
  63. data/test/stylus_test.rb +2 -2
  64. data/test/templates_test.rb +3 -3
  65. data/test/textile_test.rb +2 -2
  66. data/test/wlang_test.rb +1 -1
  67. data/test/yajl_test.rb +2 -2
  68. metadata +10 -11
  69. data/AUTHORS +0 -61
@@ -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 códigos a seguir utilizam caracteres UTF-8, então caso esteja utilizando uma versão de ruby inferior a `2.0.0` adicione o enconding no início de seus arquivos:
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 ao pedido.
131
+ rota encontrada responde a requisição.
75
132
 
76
- Padrões de rota podem conter parâmetros nomeados, acessível através do
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[:nome] é 'foo' ou 'bar'
83
- "Olá #{params[:nome]}!"
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 através dos parâmetros de
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 (wildcard),
97
- acessível através do array `params[: splat]`:
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[:splat] # => ["ola", "mundo"]
162
+ params['splat'] # => ["ola", "mundo"]
103
163
  end
104
164
 
105
165
  get '/download/*.*' do
106
- # corresponde a /download/pasta/do/arquivo.xml
107
- params[:splat] # => ["pasta/do/arquivo", "xml"]
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 |pasta, ext|
115
- [pasta, ext] # => ["pasta/do/arquivo", "xml"]
174
+ get '/download/*.*' do |caminho, ext|
175
+ [caminho, ext] # => ["caminho/do/arquivo", "xml"]
116
176
  end
117
177
  ```
118
178
 
119
- Rotas podem corresponder com expressões regulares:
179
+ Rotas podem casar com expressões regulares:
120
180
 
121
181
  ``` ruby
122
- get %r{/ola/([\w]+)} do
123
- "Olá, #{params[:captures].first}!"
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
- ### Condições
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[:agent][0]}"
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 levam vários valores:
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
- ### Retorno de valores
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. Mas, outros valores também são aceitos.
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 disto, é possível
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
- - Um array com três elementros: `[status (Fixnum), cabecalho (Hash),
295
+ * Um array com três elementros: `[status (Fixnum), cabecalho (Hash),
223
296
  corpo da resposta (responde à #each)]`
224
297
 
225
- - Um array com dois elementros: `[status (Fixnum), corpo da resposta
298
+ * Um array com dois elementros: `[status (Fixnum), corpo da resposta
226
299
  (responde à #each)]`
227
300
 
228
- - Um objeto que responda à `#each` sem passar nada, mas, sim, `strings`
301
+ * Um objeto que responda à `#each` sem passar nada, mas, sim, `strings`
229
302
  para um dado bloco
230
303
 
231
- - Um objeto `Fixnum` representando o código de status
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
- ### Custom Route Matchers
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://example.com/css/style.css`.
381
+ `http://exemplo.com/css/style.css`.
309
382
 
310
383
  ## Views / Templates
311
384
 
312
- Templates presumem-se estar localizados sob o diretório `./views`. Para
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
- set :views, File.dirname(__FILE__) + '/modelo'
388
+ get '/' do
389
+ erb :index
390
+ end
317
391
  ```
318
392
 
319
- Uma coisa importante a ser lembrada é que você sempre tem as referências
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
- ### Haml Templates
395
+ Ao invés do nome do template, você também pode passar direto o conteúdo do template:
325
396
 
326
- A gem/biblioteca haml é necessária para renderizar templates HAML:
397
+ ```ruby
398
+ get '/' do
399
+ code = "<%= Time.now %>"
400
+ erb code
401
+ end
402
+ ```
327
403
 
328
- ``` ruby
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
- haml :index
408
+ erb :index, :layout => :post
334
409
  end
335
410
  ```
336
411
 
337
- Renderiza `./views/index.haml`.
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
- [Opções
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, :haml_options => {:format => :html4 } # substituido
418
+ haml :index, :format => :html5
350
419
  end
351
420
  ```
352
421
 
353
- ### Erb Templates
422
+ Você também pode definir opções padrões para um tipo de template:
354
423
 
355
424
  ``` ruby
356
- # Você precisa do 'require erb' em sua aplicação
357
- require 'erb'
425
+ set :haml, :format => :html5
358
426
 
359
427
  get '/' do
360
- erb :index
428
+ haml :index
361
429
  end
362
430
  ```
363
431
 
364
- Renderiza `./views/index.erb`
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
- ### Erubis
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
- A gem/biblioteca erubis é necessária para renderizar templates erubis:
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
- erubis :index
509
+ haml '%div.title Olá Mundo'
376
510
  end
377
511
  ```
378
512
 
379
- Renderiza `./views/index.erubis`
513
+ Renderiza um template string.
380
514
 
381
- ### Builder Templates
515
+ ### Linguagens de template disponíveis
382
516
 
383
- A gem/biblioteca builder é necessária para renderizar templates builder:
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
- # Você precisa do 'require builder' em sua aplicação.
387
- require 'builder'
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
- get '/' do
390
- content_type 'application/xml', :charset => 'utf-8'
391
- builder :index
392
- end
698
+ ``` ruby
699
+ erb :overview, :locals => { :text => markdown(:introducao) }
393
700
  ```
394
701
 
395
- Renderiza `./views/index.builder`.
702
+ Note que vcoê também pode chamar o método `markdown` dentro de outros templates:
396
703
 
397
- ### Sass Templates
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
- A gem/biblioteca sass é necessária para renderizar templates sass:
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
- # Você precisa do 'require haml' ou 'require sass' em sua aplicação.
403
- require 'sass'
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
- get '/stylesheet.css' do
406
- content_type 'text/css', :charset => 'utf-8'
407
- sass :stylesheet
408
- end
766
+ ``` ruby
767
+ erb :overview, :locals => { :text => rdoc(:introducao) }
409
768
  ```
410
769
 
411
- Renderiza `./views/stylesheet.sass`.
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
- set :sass, {:style => :compact } # o estilo padrão do Sass é :nested
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
- get '/stylesheet.css' do
423
- content_type 'text/css', :charset => 'utf-8'
424
- sass :stylesheet, :style => :expanded # substituido
425
- end
894
+ ``` ruby
895
+ erb :overview, :locals => { :text => creole(:introduction) }
426
896
  ```
427
897
 
428
- ### Less Templates
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
- # Você precisa do 'require less' em sua aplicação.
434
- require 'less'
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
- get '/stylesheet.css' do
437
- content_type 'text/css', :charset => 'utf-8'
438
- less :stylesheet
439
- end
931
+ ``` ruby
932
+ erb :overview, :locals => { :text => mediawiki(:introduction) }
440
933
  ```
441
934
 
442
- Renderiza `./views/stylesheet.less`.
935
+ Note that you may also call the `mediawiki` method from within other templates:
443
936
 
444
- ### Inline Templates
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
- haml '%div.title Olá Mundo'
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
- Renderiza a string, em uma linha, no template.
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
- ### Acessando Variáveis nos Templates
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[:id])
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[:id])
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
- ## Helpers
1179
+ ### Associando extensões de arquivos
535
1180
 
536
- Use o método de alto nível `helpers` para definir métodos auxiliares
537
- para utilizar em manipuladores de rotas e modelos:
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 bar(nome)
542
- "#{nome}bar"
543
- end
1195
+ def myat(*args) render(:myat, *args) end
544
1196
  end
545
1197
 
546
- get '/:nome' do
547
- bar(params[:nome])
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 pode modificar a requisição e a reposta. Variáveis de
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[:splat] #=> 'bar/baz'
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 o pedido e a resposta. Variáveis de
572
- instância definidas nos filtros before e rotas são acessadas através dos
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 tem um padrão, fazendo com que sejam avaliados
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
- ## Halting
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
- ## Passing
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[:quem] == 'Frank'
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` manipulador é invocado:
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'].name
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 Rack
1525
+ ## Rack Middleware
763
1526
 
764
- O Sinatra roda no [Rack](http://rack.rubyforge.org/), uma interface
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://rack.rubyforge.org/doc/classes/Rack/Builder.html)
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::Unit::TestCase
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
- - [Website do Projeto](http://www.sinatrarb.com/) - Documentação
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
- - [Acompanhar Questões](http://github.com/sinatra/sinatra/issues)
959
-
960
- - [Twitter](http://twitter.com/sinatra)
961
-
962
- - [Lista de Email](http://groups.google.com/group/sinatrarb/topics)
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)