Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 776 lines (533 sloc) 21.411 kb
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
1 = Sinatra
97d5c1e @lucianosousa Add note to Portugese tanslation.
lucianosousa authored
2 <i>Atenção: Este documento é apenas uma tradução da versão em inglês e pode estar desatualizado.</i>
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
3
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
4 Sinatra é uma DSL para criar aplicações web em Ruby com o mínimo de esforço e rapidez:
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
5
6 # minhaapp.rb
7 require 'sinatra'
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
8
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
9 get '/' do
10 'Olá Mundo!'
11 end
12
13 Instale a gem e execute como:
14
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
15 gem install sinatra
16 ruby -rubygems minhaapp.rb
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
17
18 Acesse em: http://localhost:4567
19
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
20 Recomendamos a execução de <tt>gem install thin</tt>. Caso esteja disponível, o Sinatra irá usar.
21
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
22 == Rotas
23
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
24 No Sinatra, uma rota é um método HTTP emparelhado com um padrão de URL. Cada rota possui um bloco de execução:
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
25
26 get '/' do
27 .. mostrando alguma coisa ..
28 end
29
30 post '/' do
31 .. criando alguma coisa ..
32 end
33
34 put '/' do
35 .. atualizando alguma coisa ..
36 end
37
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
38 patch '/' do
39 .. modificando alguma coisa ..
40 end
41
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
42 delete '/' do
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
43 .. removendo alguma coisa ..
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
44 end
45
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
46 options '/' do
47 .. estabelecendo alguma coisa ..
48 end
49
50 As rotas são interpretadas na ordem em que são definidos. A primeira rota encontrada responde ao pedido.
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
51
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
52 Padrões de rota podem conter parâmetros nomeados, acessível através do hash <tt>params</tt>:
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
53
54 get '/ola/:nome' do
55 # corresponde a "GET /ola/foo" e "GET /ola/bar"
56 # params[:nome] é 'foo' ou 'bar'
57 "Olá #{params[:nome]}!"
58 end
59
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
60 Você também pode acessar parâmetros nomeados através dos parâmetros de um bloco:
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
61
62 get '/ola/:nome' do |n|
63 "Olá #{n}!"
64 end
65
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
66 Padrões de rota também podem conter parâmetros splat (wildcard), acessível através do array <tt>params[: splat]</tt>:
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
67
68 get '/diga/*/para/*' do
69 # corresponde a /diga/ola/para/mundo
70 params[:splat] # => ["ola", "mundo"]
71 end
72
73 get '/download/*.*' do
74 # corresponde a /download/pasta/do/arquivo.xml
75 params[:splat] # => ["pasta/do/arquivo", "xml"]
76 end
77
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
78 Ou com parâmetros de um bloco:
79
80 get '/download/*.*' do |pasta, ext|
81 [pasta, ext] # => ["pasta/do/arquivo", "xml"]
82 end
83
84 Rotas podem corresponder com expressões regulares:
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
85
86 get %r{/ola/([\w]+)} do
87 "Olá, #{params[:captures].first}!"
88 end
89
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
90 Ou com parâmetros de um bloco:
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
91
92 get %r{/ola/([\w]+)} do |c|
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
93 "Olá, #{c}!"
94 end
95
96 Padrões de rota podem contar com parâmetros opcionais:
97
98 get '/posts.?:formato?' do
99 # corresponde a "GET /posts" e qualquer extensão "GET /posts.json", "GET /posts.xml", etc.
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
100 end
101
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
102 A propósito, a menos que você desative a proteção contra ataques (veja abaixo), o caminho solicitado pode ser alterado antes de concluir a comparação com as suas rotas.
103
104 === Condições
105
106 Rotas podem incluir uma variedade de condições, tal como o <tt>user agent</tt>:
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
107
108 get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
109 "Você está usando o Songbird versão #{params[:agent][0]}"
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
110 end
111
112 get '/foo' do
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
113 # Correspondente a navegadores que não sejam Songbird
114 end
115
116 Outras condições disponíveis são <tt>host_name</tt> e <tt>provides</tt>:
117
118 get '/', :host_name => /^admin\./ do
119 "Área administrativa. Acesso negado!"
120 end
121
122 get '/', :provides => 'html' do
123 haml :index
124 end
125
126 get '/', :provides => ['rss', 'atom', 'xml'] do
127 builder :feed
128 end
129
130 Você pode facilmente definir suas próprias condições:
131
132 set(:probabilidade) { |valor| condition { rand <= valor } }
133
134 get '/ganha_um_carro', :probabilidade => 0.1 do
135 "Você ganhou!"
136 end
137
138 get '/ganha_um_carro' do
139 "Sinto muito, você perdeu."
140 end
141
142 Use splat, para uma condição que levam vários valores:
143
144 set(:auth) do |*roles| # <- observe o splat aqui
145 condition do
146 unless logged_in? && roles.any? {|role| current_user.in_role? role }
147 redirect "/login/", 303
148 end
149 end
150 end
151
152 get "/minha/conta/", :auth => [:usuario, :administrador] do
153 "Detalhes da sua conta"
154 end
155
156 get "/apenas/administrador/", :auth => :administrador do
157 "Apenas administradores são permitidos aqui!"
158 end
159
160 === Retorno de valores
161
162 O valor de retorno do bloco de uma rota determina pelo menos o corpo da resposta passado para o cliente HTTP, ou pelo menos o próximo middleware na pilha Rack. Frequentemente, isto é uma <tt>string</tt>, tal como nos exemplos acima. Mas, outros valores também são aceitos.
163
164 Você pode retornar uma resposta válida ou um objeto para o Rack, sendo eles de qualquer tipo de objeto que queira. Além disto, é possível retornar um código de status HTTP.
165
166 * Um array com três elementros: [status (Fixnum), cabecalho (Hash), corpo da resposta (responde à #each)]
167
168 * Um array com dois elementros: [status (Fixnum), corpo da resposta (responde à #each)]
169
170 * Um objeto que responda à #each sem passar nada, mas, sim, <tt>strings</tt> para um dado bloco
171
172 * Um objeto <tt>Fixnum</tt> representando o código de status
173
174 Dessa forma, podemos implementar facilmente um exemplo de streaming:
175
176 class Stream
177 def each
178 100.times { |i| yield "#{i}\n" }
179 end
180 end
181
182 get('/') { Stream.new }
183
184 Você também pode usar o método auxiliar <tt>stream</tt> (descrito abaixo) para incorporar a lógica de streaming na rota.
185
186 === Custom Route Matchers
187
188 Como apresentado acima, a estrutura do Sinatra conta com suporte embutido para uso de padrões de String e expressões regulares como validadores de rota. No entanto, ele não pára por aí. Você pode facilmente definir os seus próprios validadores:
189
190 class AllButPattern
191 Match = Struct.new(:captures)
192
193 def initialize(except)
194 @except = except
195 @captures = Match.new([])
196 end
197
198 def match(str)
199 @captures unless @except === str
200 end
201 end
202
203 def all_but(pattern)
204 AllButPattern.new(pattern)
205 end
206
207 get all_but("/index") do
208 # ...
209 end
210
211 Note que o exemplo acima pode ser robusto e complicado em excesso. Pode também ser implementado como:
212
213 get // do
214 pass if request.path_info == "/index"
215 # ...
216 end
217
218 Ou, usando algo mais denso à frente:
219
220 get %r{^(?!/index$)} do
221 # ...
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
222 end
223
224 == Arquivos estáticos
225
226 Arquivos estáticos são disponibilizados a partir do diretório <tt>./public</tt>. Você pode especificar
d1ab58d @rkh rename public to public_folder, fixes #301
rkh authored
227 um local diferente pela opção <tt>:public_folder</tt>
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
228
d1ab58d @rkh rename public to public_folder, fixes #301
rkh authored
229 set :public_folder, File.dirname(__FILE__) + '/estatico'
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
230
231 Note que o nome do diretório público não é incluido na URL. Um arquivo
232 <tt>./public/css/style.css</tt> é disponibilizado como
233 <tt>http://example.com/css/style.css</tt>.
234
235 == Views / Templates
236
237 Templates presumem-se estar localizados sob o diretório <tt>./views</tt>.
238 Para utilizar um diretório view diferente:
239
240 set :views, File.dirname(__FILE__) + '/modelo'
241
242 Uma coisa importante a ser lembrada é que você sempre tem as referências dos
243 templates como símbolos, mesmo se eles estiverem em um sub-diretório (nesse
244 caso utilize <tt>:'subdir/template'</tt>). Métodos de renderização irão processar
245 qualquer string passada diretamente para elas.
246
247 === Haml Templates
248
249 A gem/biblioteca haml é necessária para renderizar templates HAML:
250
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
251 # Você precisa do 'require haml' em sua aplicação.
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
252 require 'haml'
253
254 get '/' do
255 haml :index
256 end
257
258 Renderiza <tt>./views/index.haml</tt>.
259
f095019 @mattwildig Update README links to Haml
mattwildig authored
260 {Opções Haml}[http://haml.info/docs/yardoc/file.HAML_REFERENCE.html#options]
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
261 podem ser setadas globalmente através das configurações do sinatra,
262 veja {Opções e Configurações}[http://www.sinatrarb.com/configuration.html],
263 e substitua em uma requisição individual.
264
265 set :haml, {:format => :html5 } # o formato padrão do Haml é :xhtml
266
267 get '/' do
268 haml :index, :haml_options => {:format => :html4 } # substituido
269 end
270
271
272 === Erb Templates
273
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
274 # Você precisa do 'require erb' em sua aplicação
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
275 require 'erb'
276
277 get '/' do
278 erb :index
279 end
280
281 Renderiza <tt>./views/index.erb</tt>
282
283 === Erubis
284
285 A gem/biblioteca erubis é necessária para renderizar templates erubis:
286
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
287 # Você precisa do 'require erubis' em sua aplicação.
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
288 require 'erubis'
289
290 get '/' do
291 erubis :index
292 end
293
294 Renderiza <tt>./views/index.erubis</tt>
295
296 === Builder Templates
297
298 A gem/biblioteca builder é necessária para renderizar templates builder:
299
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
300 # Você precisa do 'require builder' em sua aplicação.
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
301 require 'builder'
302
303 get '/' do
304 content_type 'application/xml', :charset => 'utf-8'
305 builder :index
306 end
307
308 Renderiza <tt>./views/index.builder</tt>.
309
310 === Sass Templates
311
312 A gem/biblioteca sass é necessária para renderizar templates sass:
313
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
314 # Você precisa do 'require haml' ou 'require sass' em sua aplicação.
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
315 require 'sass'
316
317 get '/stylesheet.css' do
318 content_type 'text/css', :charset => 'utf-8'
319 sass :stylesheet
320 end
321
322 Renderiza <tt>./views/stylesheet.sass</tt>.
323
324 {Opções Sass}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
325 podem ser setadas globalmente através das configurações do sinatra,
326 veja {Opções e Configurações}[http://www.sinatrarb.com/configuration.html],
327 e substitua em uma requisição individual.
328
329 set :sass, {:style => :compact } # o estilo padrão do Sass é :nested
330
331 get '/stylesheet.css' do
332 content_type 'text/css', :charset => 'utf-8'
333 sass :stylesheet, :style => :expanded # substituido
334 end
335
336 === Less Templates
337
338 A gem/biblioteca less é necessária para renderizar templates Less:
339
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
340 # Você precisa do 'require less' em sua aplicação.
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
341 require 'less'
342
343 get '/stylesheet.css' do
344 content_type 'text/css', :charset => 'utf-8'
345 less :stylesheet
346 end
347
348 Renderiza <tt>./views/stylesheet.less</tt>.
349
350 === Inline Templates
351
352 get '/' do
353 haml '%div.title Olá Mundo'
354 end
355
356 Renderiza a string, em uma linha, no template.
357
358 === Acessando Variáveis nos Templates
359
360 Templates são avaliados dentro do mesmo contexto como manipuladores de rota. Variáveis
361 de instância setadas em rotas manipuladas são diretamente acessadas por templates:
362
363 get '/:id' do
364 @foo = Foo.find(params[:id])
365 haml '%h1= @foo.nome'
366 end
367
368 Ou, especifique um hash explícito para variáveis locais:
369
370 get '/:id' do
371 foo = Foo.find(params[:id])
372 haml '%h1= foo.nome', :locals => { :foo => foo }
373 end
374
375 Isso é tipicamente utilizando quando renderizamos templates como partials dentro
376 de outros templates.
377
378 === Templates Inline
379
380 Templates podem ser definidos no final do arquivo fonte(.rb):
381
382 require 'rubygems'
383 require 'sinatra'
384
385 get '/' do
386 haml :index
387 end
388
389 __END__
390
391 @@ layout
392 %html
393 = yield
394
395 @@ index
396 %div.title Olá Mundo!!!!!
397
398 NOTA: Templates inline definidos no arquivo fonte são automaticamente carregados
399 pelo sinatra. Digite `enable :inline_templates` se você tem templates
400 inline no outro arquivo fonte.
401
402 === Templates nomeados
403
404 Templates também podem ser definidos utilizando o método top-level <tt>template</tt>:
405
406 template :layout do
407 "%html\n =yield\n"
408 end
409
410 template :index do
411 '%div.title Olá Mundo!'
412 end
413
414 get '/' do
415 haml :index
416 end
417
418 Se existir um template com nome "layout", ele será utilizado toda vez que um
419 template for renderizado. Você pode desabilitar layouts passando <tt>:layout => false</tt>.
420
421 get '/' do
422 haml :index, :layout => !request.xhr?
423 end
424
425 == Helpers
426
427 Use o método de alto nível <tt>helpers</tt> para definir métodos auxiliares para utilizar em
428 manipuladores de rotas e modelos:
429
430 helpers do
431 def bar(nome)
432 "#{nome}bar"
433 end
434 end
435
436 get '/:nome' do
437 bar(params[:nome])
438 end
439
440 == Filtros
441
442 Filtros Before são avaliados antes de cada requisição dentro do contexto da requisição
443 e pode modificar a requisição e a reposta. Variáveis de instância setadas nos
444 filtros são acessadas através de rotas e templates:
445
446 before do
447 @nota = 'Oi!'
448 request.path_info = '/foo/bar/baz'
449 end
450
451 get '/foo/*' do
452 @nota #=> 'Oi!'
453 params[:splat] #=> 'bar/baz'
454 end
455
456 Filtros After são avaliados após cada requisição dentro do contexto da
457 requisição e também podem modificar o pedido e a resposta. Variáveis de instância
458 definidas nos filtros before e rotas são acessadas através dos filtros after:
459
460 after do
461 puts response.status
462 end
463
464 Filtros opcionalmente tem um padrão, fazendo com que sejam avaliados somente se o caminho
465 do pedido coincidir com esse padrão:
466
467 before '/protected/*' do
468 authenticate!
469 end
470
471 after '/create/:slug' do |slug|
472 session[:last_slug] = slug
473 end
474
475 == Halting
476
477 Para parar imediatamente uma requisição com um filtro ou rota utilize:
478
479 halt
480
481 Você também pode especificar o status quando parar...
482
483 halt 410
484
485 Ou com corpo de texto...
486
487 halt 'isso será o corpo do texto'
488
489 Ou também...
490
491 halt 401, 'vamos embora!'
492
493 Com cabeçalhos...
494
495 halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
496
497 == Passing
498
499 Uma rota pode processar aposta para a próxima rota correspondente usando <tt>pass</tt>:
500
501 get '/adivinhar/:quem' do
502 pass unless params[:quem] == 'Frank'
503 'Você me pegou!'
504 end
505
506 get '/adivinhar/*' do
507 'Você falhou!'
508 end
509
510 O bloqueio da rota é imediatamente encerrado e o controle continua com a próxima
511 rota de parâmetro. Se o parâmetro da rota não for encontrado, um 404 é retornado.
512
513 == Configuração
514
515 Rodando uma vez, na inicialização, em qualquer ambiente:
516
517 configure do
518 ...
519 end
520
521 Rodando somente quando o ambiente (RACK_ENV environment variável) é setado para
522 <tt>:production</tt>:
523
524 configure :production do
525 ...
526 end
527
528 Rodando quando o ambiente é setado para <tt>:production</tt> ou
529 <tt>:test</tt>:
530
531 configure :production, :test do
532 ...
533 end
534
535 == Tratamento de Erros
536
537 Tratamento de erros rodam dentro do mesmo contexto como rotas e filtros before, o
538 que significa que você pega todos os presentes que tem para oferecer, como <tt>haml</tt>, <tt>erb</tt>,
539 <tt>halt</tt>, etc.
540
541 === Não Encontrado
542
543 Quando um <tt>Sinatra::NotFound</tt> exception é levantado, ou o código de status
544 da reposta é 404, o <tt>not_found</tt> manipulador é invocado:
545
546 not_found do
547 'Isto está longe de ser encontrado'
548 end
549
550 === Erro
551
552 O manipulador +error+ é invocado toda a vez que uma exceção é lançada a partir de
553 um bloco de rota ou um filtro. O objeto da exceção pode ser obtido a partir da variável
554 Rack <tt>sinatra.error</tt>:
555
556 error do
557 'Desculpe, houve um erro desagradável - ' + env['sinatra.error'].name
558 end
559
560 Erros customizados:
561
562 error MeuErroCustomizado do
66f1256 @rkh env is accessable directly, no need to use request.env
rkh authored
563 'Então que aconteceu foi...' + env['sinatra.error'].message
aed84d9 @lucianosousa Add Portugese translation.
lucianosousa authored
564 end
565
566 Então, se isso acontecer:
567
568 get '/' do
569 raise MeuErroCustomizado, 'alguma coisa ruim'
570 end
571
572 Você receberá isso:
573
574 Então que aconteceu foi... alguma coisa ruim
575
576 Alternativamente, você pode instalar manipulador de erro para um código de status:
577
578 error 403 do
579 'Accesso negado'
580 end
581
582 get '/secreto' do
583 403
584 end
585
586 Ou um range:
587
588 error 400..510 do
589 'Boom'
590 end
591
592 O Sinatra instala os manipuladores especiais <tt>not_found</tt> e <tt>error</tt> quando
593 roda sobre o ambiente de desenvolvimento.
594
595 == Mime Types
596
597 Quando utilizamos <tt>send_file</tt> ou arquivos estáticos você pode ter mime types Sinatra
598 não entendidos. Use +mime_type+ para registrar eles por extensão de arquivos:
599
600 mime_type :foo, 'text/foo'
601
602 Você também pode utilizar isto com o helper +content_type+:
603
604 content_type :foo
605
606 == Middleware Rack
607
608 O Sinatra roda no Rack[http://rack.rubyforge.org/], uma interface padrão
609 mínima para frameworks web em Ruby. Um das capacidades mais interessantes do Rack
610 para desenvolver aplicativos é suporte a "middleware" -- componentes que ficam
611 entre o servidor e sua aplicação monitorando e/ou manipulando o request/response do
612 HTTP para prover vários tipos de funcionalidades comuns.
613
614 O Sinatra faz construtores pipelines do middleware Rack facilmente em um nível superior
615 utilizando o método +use+:
616
617 require 'sinatra'
618 require 'meu_middleware_customizado'
619
620 use Rack::Lint
621 use MeuMiddlewareCustomizado
622
623 get '/ola' do
624 'Olá mundo'
625 end
626
627 A semântica de +use+ é idêntica aquela definida para a DSL
628 Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html]
629 (mais frequentemente utilizada para arquivos rackup). Por exemplo, o método +use+
630 aceita múltiplos argumentos/variáveis bem como blocos:
631
632 use Rack::Auth::Basic do |usuario, senha|
633 usuario == 'admin' && senha == 'secreto'
634 end
635
636 O Rack é distribuido com uma variedade de middleware padrões para logs,
637 debugs, rotas de URL, autenticação, e manipuladores de sessão. Sinatra utilizada
638 muitos desses componentes automaticamente baseando sobre configuração, então, tipicamente
639 você não tem +use+ explicitamente.
640
641 == Testando
642
643 Testes no Sinatra podem ser escritos utilizando qualquer biblioteca ou framework
644 de teste baseados no Rack. {Rack::Test}[http://gitrdoc.com/brynary/rack-test] é
645 recomendado:
646
647 require 'minha_aplicacao_sinatra'
648 require 'rack/test'
649
650 class MinhaAplicacaoTeste < Test::Unit::TestCase
651 include Rack::Test::Methods
652
653 def app
654 Sinatra::Application
655 end
656
657 def meu_test_default
658 get '/'
659 assert_equal 'Ola Mundo!', last_response.body
660 end
661
662 def teste_com_parametros
663 get '/atender', :name => 'Frank'
664 assert_equal 'Olá Frank!', last_response.bodymeet
665 end
666
667 def test_com_ambiente_rack
668 get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
669 assert_equal "Você está utilizando o Songbird!", last_response.body
670 end
671 end
672
673 NOTA: Os módulos de classe embutidos Sinatra::Test e Sinatra::TestHarness
674 são depreciados na versão 0.9.2.
675
676 == Sinatra::Base - Middleware, Bibliotecas e aplicativos modulares
677
678 Definir sua aplicação em um nível superior de trabalho funciona bem para micro aplicativos, mas tem
679 consideráveis incovenientes na construção de componentes reutilizáveis como um middleware Rack,
680 metal Rails, bibliotecas simples como um componente de servidor, ou
681 mesmo extensões Sinatra. A DSL de nível superior polui o espaço do objeto
682 e assume um estilo de configuração de micro aplicativos (exemplo: uma simples arquivo de
683 aplicação, diretórios ./public e ./views, logs, página de detalhes de exceção,
684 etc.). É onde o Sinatra::Base entra em jogo:
685
686 require 'sinatra/base'
687
688 class MinhaApp < Sinatra::Base
689 set :sessions, true
690 set :foo, 'bar'
691
692 get '/' do
693 'Ola mundo!'
694 end
695 end
696
697 A classe MinhaApp é um componente Rack independente que pode agir como um
698 middleware Rack, uma aplicação Rack, ou metal Rails. Você pode +utilizar+ ou
699 +executar+ esta classe com um arquivo rackup +config.ru+; ou, controlar um componente
700 de servidor fornecendo como biblioteca:
701
702 MinhaApp.run! :host => 'localhost', :port => 9090
703
704 Os métodos disponíveis para subclasses Sinatra::Base são exatamente como aqueles
705 disponíveis via a DSL de nível superior. Aplicações de nível mais alto podem ser convertidas para
706 componentes Sinatra::Base com duas modificações:
707
708 * Seu arquivo deve requerer +sinatra/base+ ao invés de +sinatra+;
709 outra coisa, todos os métodos DSL do Sinatra são importados para o espaço
710 principal.
711 * Coloque as rotas da sua aplicação, manipuladores de erro, filtros e opções na subclasse de
712 um Sinatra::Base.
713
714 +Sinatra::Base+ é um quadro branco. Muitas opções são desabilitadas por padrão,
715 incluindo o servidor embutido. Veja {Opções e Configurações}[http://sinatra.github.com/configuration.html]
716 para detalhes de opções disponíveis e seus comportamentos.
717
718 SIDEBAR: A DSL de alto nível do Sinatra é implementada utilizando um simples sistema de
719 delegação. A classe +Sinatra::Application+ -- uma subclasse especial da
720 Sinatra::Base -- recebe todos os :get, :put, :post, :delete, :before,
721 :error, :not_found, :configure, e :set messages enviados para o
722 alto nível. Dê uma olhada no código você mesmo: aqui está o
723 {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
724 sendo {incluido dentro de um espaço principal}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28]
725
726 == Linha de Comando
727
728 Aplicações Sinatra podem ser executadas diretamente:
729
730 ruby minhaapp.rb [-h] [-x] [-e AMBIENTE] [-p PORTA] [-o HOST] [-s SERVIDOR]
731
732 As opções são:
733
734 -h # ajuda
735 -p # define a porta (padrão é 4567)
736 -o # define o host (padrão é 0.0.0.0)
737 -e # define o ambiente (padrão é development)
738 -s # especifica o servidor/manipulador rack (padrão é thin)
739 -x # ativa o bloqueio (padrão é desligado)
740
741 == A última versão
742
743 Se você gostaria de utilizar o código da última versão do Sinatra, crie um clone
744 local e execute sua aplicação com o diretório <tt>sinatra/lib</tt> no
745 <tt>LOAD_PATH</tt>:
746
747 cd minhaapp
748 git clone git://github.com/sinatra/sinatra.git
749 ruby -I sinatra/lib minhaapp.rb
750
751 Alternativamente, você pode adicionar o diretório do <tt>sinatra/lib</tt> no
752 <tt>LOAD_PATH</tt> do seu aplicativo:
753
754 $LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
755 require 'rubygems'
756 require 'sinatra'
757
758 get '/sobre' do
759 "Estou rodando a versão" + Sinatra::VERSION
760 end
761
762 Para atualizar o código do Sinatra no futuro:
763
764 cd meuprojeto/sinatra
765 git pull
766
767 == Mais
768
769 * {Website do Projeto}[http://www.sinatrarb.com/] - Documentação adicional,
770 novidades e links para outros recursos.
771 * {Contribuir}[http://www.sinatrarb.com/contributing] - Encontrar um bug? Precisa
772 de ajuda? Tem um patch?
773 * {Acompanhar Questões}[http://github.com/sinatra/sinatra/issues]
774 * {Twitter}[http://twitter.com/sinatra]
775 * {Lista de Email}[http://groups.google.com/group/sinatrarb/topics]
199dbe0 @rogeriozambon Some changes and corrections in PT-BR documentation
rogeriozambon authored
776 * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] em http://freenode.net
Something went wrong with that request. Please try again.