diff --git a/README.pt-br.rdoc b/README.pt-br.rdoc index 22128956..e9e6d788 100644 --- a/README.pt-br.rdoc +++ b/README.pt-br.rdoc @@ -1,27 +1,27 @@ = Sinatra Atenção: Este documento é apenas uma tradução da versão em inglês e pode estar desatualizado. -Sinatra é uma DSL para criar rapidamente aplicações web em Ruby com o mínimo de -esforço: +Sinatra é uma DSL para criar aplicações web em Ruby com o mínimo de esforço e rapidez: # minhaapp.rb - require 'rubygems' require 'sinatra' + get '/' do 'Olá Mundo!' end Instale a gem e execute como: - sudo gem install sinatra - ruby minhaapp.rb + gem install sinatra + ruby -rubygems minhaapp.rb Acesse em: http://localhost:4567 +Recomendamos a execução de gem install thin. Caso esteja disponível, o Sinatra irá usar. + == Rotas -No Sinatra, uma rota é um metodo HTTP associado a uma URL correspondente padrão. -Cada rota é associada a um bloco: +No Sinatra, uma rota é um método HTTP emparelhado com um padrão de URL. Cada rota possui um bloco de execução: get '/' do .. mostrando alguma coisa .. @@ -35,15 +35,21 @@ Cada rota é associada a um bloco: .. atualizando alguma coisa .. end - delete '/' do - .. apagando alguma coisa .. + patch '/' do + .. modificando alguma coisa .. end -Rotas são encontradas na ordem em que são definidas. A primeira rota que -é encontrada invoca o pedido. + delete '/' do + .. removendo alguma coisa .. + end -Padrões de rota podem incluir parâmetros nomeados, acessáveis via a -hash params: + options '/' do + .. estabelecendo alguma coisa .. + end + +As rotas são interpretadas na ordem em que são definidos. A primeira rota encontrada responde ao pedido. + +Padrões de rota podem conter parâmetros nomeados, acessível através do hash params: get '/ola/:nome' do # corresponde a "GET /ola/foo" e "GET /ola/bar" @@ -51,14 +57,13 @@ hash params: "Olá #{params[:nome]}!" end -Você também pode acessar parâmetros nomeados via bloco de parâmetros: +Você também pode acessar parâmetros nomeados através dos parâmetros de um bloco: get '/ola/:nome' do |n| "Olá #{n}!" end -Padrões de rota também podem incluir parâmetros splat (ou curingas), acessáveis -via o array params[:splat]. +Padrões de rota também podem conter parâmetros splat (wildcard), acessível através do array params[: splat]: get '/diga/*/para/*' do # corresponde a /diga/ola/para/mundo @@ -70,26 +75,150 @@ via o array params[:splat]. params[:splat] # => ["pasta/do/arquivo", "xml"] end -Rotas se correspondem com expressões regulares: +Ou com parâmetros de um bloco: + + get '/download/*.*' do |pasta, ext| + [pasta, ext] # => ["pasta/do/arquivo", "xml"] + end + +Rotas podem corresponder com expressões regulares: get %r{/ola/([\w]+)} do "Olá, #{params[:captures].first}!" end -Ou com um bloco de parâmetro: +Ou com parâmetros de um bloco: get %r{/ola/([\w]+)} do |c| - "Hello, #{c}!" + "Olá, #{c}!" end -Rotas podem incluir uma variedade de condições correspondes, tal como o agente usuário: +Padrões de rota podem contar com parâmetros opcionais: + + get '/posts.?:formato?' do + # corresponde a "GET /posts" e qualquer extensão "GET /posts.json", "GET /posts.xml", etc. + end + +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. + +=== Condições + +Rotas podem incluir uma variedade de condições, tal como o user agent: get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do - "Você está utilizando a versão #{params[:agent][0]} do Songbird." + "Você está usando o Songbird versão #{params[:agent][0]}" end get '/foo' do - # Corresponde a um navegador não Songbird + # Correspondente a navegadores que não sejam Songbird + end + +Outras condições disponíveis são host_name e provides: + + get '/', :host_name => /^admin\./ do + "Área administrativa. Acesso negado!" + end + + get '/', :provides => 'html' do + haml :index + end + + get '/', :provides => ['rss', 'atom', 'xml'] do + builder :feed + end + +Você pode facilmente definir suas próprias condições: + + set(:probabilidade) { |valor| condition { rand <= valor } } + + get '/ganha_um_carro', :probabilidade => 0.1 do + "Você ganhou!" + end + + get '/ganha_um_carro' do + "Sinto muito, você perdeu." + end + +Use splat, para uma condição que levam vários valores: + + set(:auth) do |*roles| # <- observe o splat aqui + condition do + unless logged_in? && roles.any? {|role| current_user.in_role? role } + redirect "/login/", 303 + end + end + end + + get "/minha/conta/", :auth => [:usuario, :administrador] do + "Detalhes da sua conta" + end + + get "/apenas/administrador/", :auth => :administrador do + "Apenas administradores são permitidos aqui!" + end + +=== Retorno de valores + +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 string, tal como nos exemplos acima. Mas, outros valores também são aceitos. + +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. + +* Um array com três elementros: [status (Fixnum), cabecalho (Hash), corpo da resposta (responde à #each)] + +* Um array com dois elementros: [status (Fixnum), corpo da resposta (responde à #each)] + +* Um objeto que responda à #each sem passar nada, mas, sim, strings para um dado bloco + +* Um objeto Fixnum representando o código de status + +Dessa forma, podemos implementar facilmente um exemplo de streaming: + + class Stream + def each + 100.times { |i| yield "#{i}\n" } + end + end + + get('/') { Stream.new } + +Você também pode usar o método auxiliar stream (descrito abaixo) para incorporar a lógica de streaming na rota. + +=== Custom Route Matchers + +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: + + class AllButPattern + Match = Struct.new(:captures) + + def initialize(except) + @except = except + @captures = Match.new([]) + end + + def match(str) + @captures unless @except === str + end + end + + def all_but(pattern) + AllButPattern.new(pattern) + end + + get all_but("/index") do + # ... + end + +Note que o exemplo acima pode ser robusto e complicado em excesso. Pode também ser implementado como: + + get // do + pass if request.path_info == "/index" + # ... + end + +Ou, usando algo mais denso à frente: + + get %r{^(?!/index$)} do + # ... end == Arquivos estáticos @@ -644,4 +773,4 @@ Para atualizar o código do Sinatra no futuro: * {Acompanhar Questões}[http://github.com/sinatra/sinatra/issues] * {Twitter}[http://twitter.com/sinatra] * {Lista de Email}[http://groups.google.com/group/sinatrarb/topics] -* {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] em http://freenode.net +* {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] em http://freenode.net \ No newline at end of file