Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

add Portuguese README

  • Loading branch information...
commit 52d412f1330ff7d6cac8927d4b660eb0cdf48275 1 parent 345ccb2
@rkh rkh authored
View
2  Rakefile
@@ -4,7 +4,7 @@ require 'uri'
def readme(pattern = "%s", &block)
return readme(pattern).each(&block) if block_given?
- %w[en de es fr hu jp zh ru].map do |lang|
+ %w[en de es fr hu jp zh ru pt-br].map do |lang|
pattern % "README#{lang == "en" ? "" : ".#{lang}"}"
end
end
View
749 _includes/README.pt-br.html
@@ -0,0 +1,749 @@
+<div class='toc'>
+ <ol class='level-1'>
+ <li><a href='#Rotas'>Rotas</a></li>
+ <li><a href='#Arquivos%20est%C3%A1ticos'>Arquivos estáticos</a></li>
+ <li><a href='#Views%20/%20Templates'>Views / Templates</a></li>
+ <ol class='level-2'>
+ <li><a href='#Haml%20Templates'>Haml Templates</a></li>
+ <li><a href='#Erb%20Templates'>Erb Templates</a></li>
+ <li><a href='#Erubis'>Erubis</a></li>
+ <li><a href='#Builder%20Templates'>Builder Templates</a></li>
+ <li><a href='#Sass%20Templates'>Sass Templates</a></li>
+ <li><a href='#Less%20Templates'>Less Templates</a></li>
+ <li><a href='#Inline%20Templates'>Inline Templates</a></li>
+ <li><a href='#Acessando%20Vari%C3%A1veis%20nos%20Templates'>Acessando Variáveis nos Templates</a></li>
+ <li><a href='#Templates%20Inline'>Templates Inline</a></li>
+ <li><a href='#Templates%20nomeados'>Templates nomeados</a></li>
+ </ol>
+ <li><a href='#Helpers'>Helpers</a></li>
+ <li><a href='#Filtros'>Filtros</a></li>
+ <li><a href='#Halting'>Halting</a></li>
+ <li><a href='#Passing'>Passing</a></li>
+ <li><a href='#Configura%C3%A7%C3%A3o'>Configuração</a></li>
+ <li><a href='#Tratamento%20de%20Erros'>Tratamento de Erros</a></li>
+ <ol class='level-2'>
+ <li><a href='#N%C3%A3o%20Encontrado'>Não Encontrado</a></li>
+ <li><a href='#Erro'>Erro</a></li>
+ </ol>
+ <li><a href='#Mime%20Types'>Mime Types</a></li>
+ <li><a href='#Middleware%20Rack'>Middleware Rack</a></li>
+ <li><a href='#Testando'>Testando</a></li>
+ <li><a href='#Sinatra::Base%20-%20Middleware,%20Bibliotecas%20e%20aplicativos%20modulares'>Sinatra::Base - Middleware, Bibliotecas e aplicativos modulares</a></li>
+ <li><a href='#Linha%20de%20Comando'>Linha de Comando</a></li>
+ <li><a href='#A%20%C3%BAltima%20vers%C3%A3o'>A última versão</a></li>
+ <li><a href='#Mais'>Mais</a></li>
+ </ol>
+</div>
+
+
+
+<p><em>Atenção: Este documento é apenas uma tradução da versão em
+inglês e pode estar desatualizado.</em></p>
+
+<p>Sinatra é uma DSL para criar rapidamente aplicações web em Ruby com o
+mínimo de esforço:</p>
+
+<pre># minhaapp.rb
+require 'rubygems'
+require 'sinatra'
+get '/' do
+ 'Olá Mundo!'
+end</pre>
+
+<p>Instale a gem e execute como:</p>
+
+<pre>sudo gem install sinatra
+ruby minhaapp.rb</pre>
+
+<p>Acesse em: <a href="http://localhost:4567">localhost:4567</a></p>
+
+<a name='Rotas'></a>
+<h2>Rotas</h2>
+
+<p>No Sinatra, uma rota é um metodo HTTP associado a uma URL correspondente
+padrão. Cada rota é associada a um bloco:</p>
+
+<pre>get '/' do
+ .. mostrando alguma coisa ..
+end
+
+post '/' do
+ .. criando alguma coisa ..
+end
+
+put '/' do
+ .. atualizando alguma coisa ..
+end
+
+delete '/' do
+ .. apagando alguma coisa ..
+end</pre>
+
+<p>Rotas são encontradas na ordem em que são definidas. A primeira rota que
+é encontrada invoca o pedido.</p>
+
+<p>Padrões de rota podem incluir parâmetros nomeados, acessáveis via a hash
+<tt>params</tt>:</p>
+
+<pre>get '/ola/:nome' do
+ # corresponde a &quot;GET /ola/foo&quot; e &quot;GET /ola/bar&quot;
+ # params[:nome] é 'foo' ou 'bar'
+ &quot;Olá #{params[:nome]}!&quot;
+end</pre>
+
+<p>Você também pode acessar parâmetros nomeados via bloco de parâmetros:</p>
+
+<pre>get '/ola/:nome' do |n|
+ &quot;Olá #{n}!&quot;
+end</pre>
+
+<p>Padrões de rota também podem incluir parâmetros splat (ou curingas),
+acessáveis via o array <tt>params[:splat]</tt>.</p>
+
+<pre>get '/diga/*/para/*' do
+ # corresponde a /diga/ola/para/mundo
+ params[:splat] # =&gt; [&quot;ola&quot;, &quot;mundo&quot;]
+end
+
+get '/download/*.*' do
+ # corresponde a /download/pasta/do/arquivo.xml
+ params[:splat] # =&gt; [&quot;pasta/do/arquivo&quot;, &quot;xml&quot;]
+end</pre>
+
+<p>Rotas se correspondem com expressões regulares:</p>
+
+<pre>get %r{/ola/([\w]+)} do
+ &quot;Olá, #{params[:captures].first}!&quot;
+end</pre>
+
+<p>Ou com um bloco de parâmetro:</p>
+
+<pre>get %r{/ola/([\w]+)} do |c|
+ &quot;Hello, #{c}!&quot;
+end</pre>
+
+<p>Rotas podem incluir uma variedade de condições correspondes, tal como o
+agente usuário:</p>
+
+<pre>get '/foo', :agent =&gt; /Songbird (\d\.\d)[\d\/]*?/ do
+ &quot;Você está utilizando a versão #{params[:agent][0]} do Songbird.&quot;
+end
+
+get '/foo' do
+ # Corresponde a um navegador não Songbird
+end</pre>
+
+<a name='Arquivos%20est%C3%A1ticos'></a>
+<h2>Arquivos estáticos</h2>
+
+<p>Arquivos estáticos são disponibilizados a partir do diretório
+<tt>./public</tt>. Você pode especificar um local diferente pela opção
+<tt>:public</tt></p>
+
+<pre>set :public, File.dirname(__FILE__) + '/estatico'</pre>
+
+<p>Note que o nome do diretório público não é incluido na URL. Um arquivo
+<tt>./public/css/style.css</tt> é disponibilizado como <tt><a
+href="http://example.com/css/style.css">example.com/css/style.css</a></tt>.</p>
+
+<a name='Views%20/%20Templates'></a>
+<h2>Views / Templates</h2>
+
+<p>Templates presumem-se estar localizados sob o diretório <tt>./views</tt>.
+Para utilizar um diretório view diferente:</p>
+
+<pre>set :views, File.dirname(__FILE__) + '/modelo'</pre>
+
+<p>Uma coisa importante a ser lembrada é que você sempre tem as referências
+dos templates como símbolos, mesmo se eles estiverem em um sub-diretório
+(nesse caso utilize <tt>:'subdir/template'</tt>). Métodos de
+renderização irão processar qualquer string passada diretamente para
+elas.</p>
+
+<a name='Haml%20Templates'></a>
+<h3>Haml Templates</h3>
+
+<p>A gem/biblioteca haml é necessária para renderizar templates HAML:</p>
+
+<pre>## Você precisa do 'require haml' em sua aplicação.
+require 'haml'
+
+get '/' do
+ haml :index
+end</pre>
+
+<p>Renderiza <tt>./views/index.haml</tt>.</p>
+
+<p><a
+href="http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options">Opções
+Haml</a> podem ser setadas globalmente através das configurações do
+sinatra, veja <a
+href="http://www.sinatrarb.com/configuration.html">Opções e
+Configurações</a>, e substitua em uma requisição individual.</p>
+
+<pre>set :haml, {:format =&gt; :html5 } # o formato padrão do Haml é :xhtml
+
+get '/' do
+ haml :index, :haml_options =&gt; {:format =&gt; :html4 } # substituido
+end</pre>
+
+<a name='Erb%20Templates'></a>
+<h3>Erb Templates</h3>
+
+<pre>## Você precisa do 'require erb' em sua aplicação
+require 'erb'
+
+get '/' do
+ erb :index
+end</pre>
+
+<p>Renderiza <tt>./views/index.erb</tt></p>
+
+<a name='Erubis'></a>
+<h3>Erubis</h3>
+
+<p>A gem/biblioteca erubis é necessária para renderizar templates erubis:</p>
+
+<pre>## Você precisa do 'require erubis' em sua aplicação.
+require 'erubis'
+
+get '/' do
+ erubis :index
+end</pre>
+
+<p>Renderiza <tt>./views/index.erubis</tt></p>
+
+<a name='Builder%20Templates'></a>
+<h3>Builder Templates</h3>
+
+<p>A gem/biblioteca builder é necessária para renderizar templates builder:</p>
+
+<pre>## Você precisa do 'require builder' em sua aplicação.
+require 'builder'
+
+get '/' do
+ content_type 'application/xml', :charset =&gt; 'utf-8'
+ builder :index
+end</pre>
+
+<p>Renderiza <tt>./views/index.builder</tt>.</p>
+
+<a name='Sass%20Templates'></a>
+<h3>Sass Templates</h3>
+
+<p>A gem/biblioteca sass é necessária para renderizar templates sass:</p>
+
+<pre>## Você precisa do 'require haml' ou 'require sass' em sua aplicação.
+require 'sass'
+
+get '/stylesheet.css' do
+ content_type 'text/css', :charset =&gt; 'utf-8'
+ sass :stylesheet
+end</pre>
+
+<p>Renderiza <tt>./views/stylesheet.sass</tt>.</p>
+
+<p><a
+href="http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options">Opções
+Sass</a> podem ser setadas globalmente através das configurações do
+sinatra, veja <a
+href="http://www.sinatrarb.com/configuration.html">Opções e
+Configurações</a>, e substitua em uma requisição individual.</p>
+
+<pre>set :sass, {:style =&gt; :compact } # o estilo padrão do Sass é :nested
+
+get '/stylesheet.css' do
+ content_type 'text/css', :charset =&gt; 'utf-8'
+ sass :stylesheet, :style =&gt; :expanded # substituido
+end</pre>
+
+<a name='Less%20Templates'></a>
+<h3>Less Templates</h3>
+
+<p>A gem/biblioteca less é necessária para renderizar templates Less:</p>
+
+<pre>## Você precisa do 'require less' em sua aplicação.
+require 'less'
+
+get '/stylesheet.css' do
+ content_type 'text/css', :charset =&gt; 'utf-8'
+ less :stylesheet
+end</pre>
+
+<p>Renderiza <tt>./views/stylesheet.less</tt>.</p>
+
+<a name='Inline%20Templates'></a>
+<h3>Inline Templates</h3>
+
+<pre>get '/' do
+ haml '%div.title Olá Mundo'
+end</pre>
+
+<p>Renderiza a string, em uma linha, no template.</p>
+
+<a name='Acessando%20Vari%C3%A1veis%20nos%20Templates'></a>
+<h3>Acessando Variáveis nos Templates</h3>
+
+<p>Templates são avaliados dentro do mesmo contexto como manipuladores de
+rota. Variáveis de instância setadas em rotas manipuladas são
+diretamente acessadas por templates:</p>
+
+<pre>get '/:id' do
+ @foo = Foo.find(params[:id])
+ haml '%h1= @foo.nome'
+end</pre>
+
+<p>Ou, especifique um hash explícito para variáveis locais:</p>
+
+<pre>get '/:id' do
+ foo = Foo.find(params[:id])
+ haml '%h1= foo.nome', :locals =&gt; { :foo =&gt; foo }
+end</pre>
+
+<p>Isso é tipicamente utilizando quando renderizamos templates como partials
+dentro de outros templates.</p>
+
+<a name='Templates%20Inline'></a>
+<h3>Templates Inline</h3>
+
+<p>Templates podem ser definidos no final do arquivo fonte(.rb):</p>
+
+<pre>require 'rubygems'
+require 'sinatra'
+
+get '/' do
+ haml :index
+end
+
+__END__
+
+@@ layout
+%html
+ = yield
+
+@@ index
+%div.title Olá Mundo!!!!!</pre>
+
+<p>NOTA: Templates inline definidos no arquivo fonte são automaticamente
+carregados pelo sinatra. Digite `enable :inline_templates` se você tem
+templates inline no outro arquivo fonte.</p>
+
+<a name='Templates%20nomeados'></a>
+<h3>Templates nomeados</h3>
+
+<p>Templates também podem ser definidos utilizando o método top-level
+<tt>template</tt>:</p>
+
+<pre>template :layout do
+ &quot;%html\n =yield\n&quot;
+end
+
+template :index do
+ '%div.title Olá Mundo!'
+end
+
+get '/' do
+ haml :index
+end</pre>
+
+<p>Se existir um template com nome “layout”, ele será utilizado toda vez
+que um template for renderizado. Você pode desabilitar layouts passando
+<tt>:layout =&gt; false</tt>.</p>
+
+<pre>get '/' do
+ haml :index, :layout =&gt; !request.xhr?
+end</pre>
+
+<a name='Helpers'></a>
+<h2>Helpers</h2>
+
+<p>Use o método de alto nível <tt>helpers</tt> para definir métodos
+auxiliares para utilizar em manipuladores de rotas e modelos:</p>
+
+<pre>helpers do
+ def bar(nome)
+ &quot;#{nome}bar&quot;
+ end
+end
+
+get '/:nome' do
+ bar(params[:nome])
+end</pre>
+
+<a name='Filtros'></a>
+<h2>Filtros</h2>
+
+<p>Filtros Before são avaliados antes de cada requisição dentro do contexto
+da requisição e pode modificar a requisição e a reposta. Variáveis de
+instância setadas nos filtros são acessadas através de rotas e
+templates:</p>
+
+<pre>before do
+ @nota = 'Oi!'
+ request.path_info = '/foo/bar/baz'
+end
+
+get '/foo/*' do
+ @nota #=&gt; 'Oi!'
+ params[:splat] #=&gt; 'bar/baz'
+end</pre>
+
+<p>Filtros After são avaliados após cada requisição dentro do contexto da
+requisição e também podem modificar o pedido e a resposta. Variáveis de
+instância definidas nos filtros before e rotas são acessadas através dos
+filtros after:</p>
+
+<pre>after do
+ puts response.status
+end</pre>
+
+<p>Filtros opcionalmente tem um padrão, fazendo com que sejam avaliados
+somente se o caminho do pedido coincidir com esse padrão:</p>
+
+<pre>before '/protected/*' do
+ authenticate!
+end
+
+after '/create/:slug' do |slug|
+ session[:last_slug] = slug
+end</pre>
+
+<a name='Halting'></a>
+<h2>Halting</h2>
+
+<p>Para parar imediatamente uma requisição com um filtro ou rota utilize:</p>
+
+<pre>halt</pre>
+
+<p>Você também pode especificar o status quando parar…</p>
+
+<pre>halt 410</pre>
+
+<p>Ou com corpo de texto…</p>
+
+<pre>halt 'isso será o corpo do texto'</pre>
+
+<p>Ou também…</p>
+
+<pre>halt 401, 'vamos embora!'</pre>
+
+<p>Com cabeçalhos…</p>
+
+<pre>halt 402, {'Content-Type' =&gt; 'text/plain'}, 'revanche'</pre>
+
+<a name='Passing'></a>
+<h2>Passing</h2>
+
+<p>Uma rota pode processar aposta para a próxima rota correspondente usando
+<tt>pass</tt>:</p>
+
+<pre>get '/adivinhar/:quem' do
+ pass unless params[:quem] == 'Frank'
+ 'Você me pegou!'
+end
+
+get '/adivinhar/*' do
+ 'Você falhou!'
+end</pre>
+
+<p>O bloqueio da rota é imediatamente encerrado e o controle continua com a
+próxima rota de parâmetro. Se o parâmetro da rota não for encontrado,
+um 404 é retornado.</p>
+
+<a name='Configura%C3%A7%C3%A3o'></a>
+<h2>Configuração</h2>
+
+<p>Rodando uma vez, na inicialização, em qualquer ambiente:</p>
+
+<pre>configure do
+ ...
+end</pre>
+
+<p>Rodando somente quando o ambiente (RACK_ENV environment variável) é
+setado para <tt>:production</tt>:</p>
+
+<pre>configure :production do
+ ...
+end</pre>
+
+<p>Rodando quando o ambiente é setado para <tt>:production</tt> ou
+<tt>:test</tt>:</p>
+
+<pre>configure :production, :test do
+ ...
+end</pre>
+
+<a name='Tratamento%20de%20Erros'></a>
+<h2>Tratamento de Erros</h2>
+
+<p>Tratamento de erros rodam dentro do mesmo contexto como rotas e filtros
+before, o que significa que você pega todos os presentes que tem para
+oferecer, como <tt>haml</tt>, <tt>erb</tt>, <tt>halt</tt>, etc.</p>
+
+<a name='N%C3%A3o%20Encontrado'></a>
+<h3>Não Encontrado</h3>
+
+<p>Quando um <tt>Sinatra::NotFound</tt> exception é levantado, ou o código
+de status da reposta é 404, o <tt>not_found</tt> manipulador é invocado:</p>
+
+<pre>not_found do
+ 'Isto está longe de ser encontrado'
+end</pre>
+
+<a name='Erro'></a>
+<h3>Erro</h3>
+
+<p>O manipulador <tt>error</tt> é invocado toda a vez que uma exceção é
+lançada a partir de um bloco de rota ou um filtro. O objeto da exceção
+pode ser obtido a partir da variável Rack <tt>sinatra.error</tt>:</p>
+
+<pre>error do
+ 'Desculpe, houve um erro desagradável - ' + env['sinatra.error'].name
+end</pre>
+
+<p>Erros customizados:</p>
+
+<pre>error MeuErroCustomizado do
+ 'Então que aconteceu foi...' + request.env['sinatra.error'].message
+end</pre>
+
+<p>Então, se isso acontecer:</p>
+
+<pre>get '/' do
+ raise MeuErroCustomizado, 'alguma coisa ruim'
+end</pre>
+
+<p>Você receberá isso:</p>
+
+<pre>Então que aconteceu foi... alguma coisa ruim</pre>
+
+<p>Alternativamente, você pode instalar manipulador de erro para um código
+de status:</p>
+
+<pre>error 403 do
+ 'Accesso negado'
+end
+
+get '/secreto' do
+ 403
+end</pre>
+
+<p>Ou um range:</p>
+
+<pre>error 400..510 do
+ 'Boom'
+end</pre>
+
+<p>O Sinatra instala os manipuladores especiais <tt>not_found</tt> e
+<tt>error</tt> quando roda sobre o ambiente de desenvolvimento.</p>
+
+<a name='Mime%20Types'></a>
+<h2>Mime Types</h2>
+
+<p>Quando utilizamos <tt>send_file</tt> ou arquivos estáticos você pode ter
+mime types Sinatra não entendidos. Use <tt>mime_type</tt> para registrar
+eles por extensão de arquivos:</p>
+
+<pre>mime_type :foo, 'text/foo'</pre>
+
+<p>Você também pode utilizar isto com o helper <tt>content_type</tt>:</p>
+
+<pre>content_type :foo</pre>
+
+<a name='Middleware%20Rack'></a>
+<h2>Middleware Rack</h2>
+
+<p>O Sinatra roda no <a href="http://rack.rubyforge.org/">Rack</a>, uma
+interface padrão mínima para frameworks web em Ruby. Um das capacidades
+mais interessantes do Rack para desenvolver aplicativos é suporte a
+“middleware” – componentes que ficam entre o servidor e sua
+aplicação monitorando e/ou manipulando o request/response do HTTP para
+prover vários tipos de funcionalidades comuns.</p>
+
+<p>O Sinatra faz construtores pipelines do middleware Rack facilmente em um
+nível superior utilizando o método <tt>use</tt>:</p>
+
+<pre>require 'sinatra'
+require 'meu_middleware_customizado'
+
+use Rack::Lint
+use MeuMiddlewareCustomizado
+
+get '/ola' do
+ 'Olá mundo'
+end</pre>
+
+<p>A semântica de <tt>use</tt> é idêntica aquela definida para a DSL <a
+href="http://rack.rubyforge.org/doc/classes/Rack/Builder.html">Rack::Builder</a>
+(mais frequentemente utilizada para arquivos rackup). Por exemplo, o
+método <tt>use</tt> aceita múltiplos argumentos/variáveis bem como
+blocos:</p>
+
+<pre>use Rack::Auth::Basic do |usuario, senha|
+ usuario == 'admin' &amp;&amp; senha == 'secreto'
+end</pre>
+
+<p>O Rack é distribuido com uma variedade de middleware padrões para logs,
+debugs, rotas de URL, autenticação, e manipuladores de sessão. Sinatra
+utilizada muitos desses componentes automaticamente baseando sobre
+configuração, então, tipicamente você não tem <tt>use</tt>
+explicitamente.</p>
+
+<a name='Testando'></a>
+<h2>Testando</h2>
+
+<p>Testes no Sinatra podem ser escritos utilizando qualquer biblioteca ou
+framework de teste baseados no Rack. <a
+href="http://gitrdoc.com/brynary/rack-test">Rack::Test</a> é recomendado:</p>
+
+<pre>require 'minha_aplicacao_sinatra'
+require 'rack/test'
+
+class MinhaAplicacaoTeste &lt; Test::Unit::TestCase
+ include Rack::Test::Methods
+
+ def app
+ Sinatra::Application
+ end
+
+ def meu_test_default
+ get '/'
+ assert_equal 'Ola Mundo!', last_response.body
+ end
+
+ def teste_com_parametros
+ get '/atender', :name =&gt; 'Frank'
+ assert_equal 'Olá Frank!', last_response.bodymeet
+ end
+
+ def test_com_ambiente_rack
+ get '/', {}, 'HTTP_USER_AGENT' =&gt; 'Songbird'
+ assert_equal &quot;Você está utilizando o Songbird!&quot;, last_response.body
+ end
+end</pre>
+
+<p>NOTA: Os módulos de classe embutidos Sinatra::Test e Sinatra::TestHarness
+são depreciados na versão 0.9.2.</p>
+
+<a name='Sinatra::Base%20-%20Middleware,%20Bibliotecas%20e%20aplicativos%20modulares'></a>
+<h2>Sinatra::Base - Middleware, Bibliotecas e aplicativos modulares</h2>
+
+<p>Definir sua aplicação em um nível superior de trabalho funciona bem para
+micro aplicativos, mas tem consideráveis incovenientes na construção de
+componentes reutilizáveis como um middleware Rack, metal Rails,
+bibliotecas simples como um componente de servidor, ou mesmo extensões
+Sinatra. A DSL de nível superior polui o espaço do objeto e assume um
+estilo de configuração de micro aplicativos (exemplo: uma simples arquivo
+de aplicação, diretórios ./public e ./views, logs, página de detalhes
+de exceção, etc.). É onde o Sinatra::Base entra em jogo:</p>
+
+<pre>require 'sinatra/base'
+
+class MinhaApp &lt; Sinatra::Base
+ set :sessions, true
+ set :foo, 'bar'
+
+ get '/' do
+ 'Ola mundo!'
+ end
+end</pre>
+
+<p>A classe MinhaApp é um componente Rack independente que pode agir como um
+middleware Rack, uma aplicação Rack, ou metal Rails. Você pode
+<tt>utilizar</tt> ou <tt>executar</tt> esta classe com um arquivo rackup
+<tt>config.ru</tt>; ou, controlar um componente de servidor fornecendo como
+biblioteca:</p>
+
+<pre>MinhaApp.run! :host =&gt; 'localhost', :port =&gt; 9090</pre>
+
+<p>Os métodos disponíveis para subclasses Sinatra::Base são exatamente como
+aqueles disponíveis via a DSL de nível superior. Aplicações de nível
+mais alto podem ser convertidas para componentes Sinatra::Base com duas
+modificações:</p>
+<ul><li>
+<p>Seu arquivo deve requerer <tt>sinatra/base</tt> ao invés de
+<tt>sinatra</tt>; outra coisa, todos os métodos DSL do Sinatra são
+importados para o espaço principal.</p>
+</li><li>
+<p>Coloque as rotas da sua aplicação, manipuladores de erro, filtros e
+opções na subclasse de um Sinatra::Base.</p>
+</li></ul>
+
+<p>+Sinatra::Base+ é um quadro branco. Muitas opções são desabilitadas por
+padrão, incluindo o servidor embutido. Veja <a
+href="http://sinatra.github.com/configuration.html">Opções e
+Configurações</a> para detalhes de opções disponíveis e seus
+comportamentos.</p>
+
+<p>SIDEBAR: A DSL de alto nível do Sinatra é implementada utilizando um
+simples sistema de delegação. A classe +Sinatra::Application+ – uma
+subclasse especial da Sinatra::Base – recebe todos os :get, :put, :post,
+:delete, :before, :error, :not_found, :configure, e :set messages enviados
+para o alto nível. Dê uma olhada no código você mesmo: aqui está o <a
+href="http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128">Sinatra::Delegator
+mixin</a> sendo <a
+href="http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28">incluido
+dentro de um espaço principal</a></p>
+
+<a name='Linha%20de%20Comando'></a>
+<h2>Linha de Comando</h2>
+
+<p>Aplicações Sinatra podem ser executadas diretamente:</p>
+
+<pre>ruby minhaapp.rb [-h] [-x] [-e AMBIENTE] [-p PORTA] [-o HOST] [-s SERVIDOR]</pre>
+
+<p>As opções são:</p>
+
+<pre>-h # ajuda
+-p # define a porta (padrão é 4567)
+-o # define o host (padrão é 0.0.0.0)
+-e # define o ambiente (padrão é development)
+-s # especifica o servidor/manipulador rack (padrão é thin)
+-x # ativa o bloqueio (padrão é desligado)</pre>
+
+<a name='A%20%C3%BAltima%20vers%C3%A3o'></a>
+<h2>A última versão</h2>
+
+<p>Se você gostaria de utilizar o código da última versão do Sinatra, crie
+um clone local e execute sua aplicação com o diretório
+<tt>sinatra/lib</tt> no <tt>LOAD_PATH</tt>:</p>
+
+<pre>cd minhaapp
+git clone git://github.com/sinatra/sinatra.git
+ruby -I sinatra/lib minhaapp.rb</pre>
+
+<p>Alternativamente, você pode adicionar o diretório do <tt>sinatra/lib</tt>
+no <tt>LOAD_PATH</tt> do seu aplicativo:</p>
+
+<pre>$LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
+require 'rubygems'
+require 'sinatra'
+
+get '/sobre' do
+ &quot;Estou rodando a versão&quot; + Sinatra::VERSION
+end</pre>
+
+<p>Para atualizar o código do Sinatra no futuro:</p>
+
+<pre>cd meuprojeto/sinatra
+git pull</pre>
+
+<a name='Mais'></a>
+<h2>Mais</h2>
+<ul><li>
+<p><a href="http://www.sinatrarb.com/">Website do Projeto</a> - Documentação
+adicional, novidades e links para outros recursos.</p>
+</li><li>
+<p><a href="http://www.sinatrarb.com/contributing">Contribuir</a> - Encontrar
+um bug? Precisa de ajuda? Tem um patch?</p>
+</li><li>
+<p><a href="http://github.com/sinatra/sinatra/issues">Acompanhar Questões</a></p>
+</li><li>
+<p><a href="http://twitter.com/sinatra">Twitter</a></p>
+</li><li>
+<p><a href="http://groups.google.com/group/sinatrarb/topics">Lista de
+Email</a></p>
+</li><li>
+<p><a href="irc://chat.freenode.net/#sinatra">IRC: #sinatra</a> em <a
+href="http://freenode.net">freenode.net</a></p>
+</li></ul>
View
1  intro-de.html
@@ -8,6 +8,7 @@
<a href="/intro-zh.html">Chinese</a>,
<a href="/intro-fr.html">French</a>,
<a href="/intro-hu.html">Hungarian</a>,
+ <a href="/intro-pt-br.html">Portuguese (Brazilian)</a>,
<a href="/intro-ru.html">Russian</a>,
<a href="/intro-es.html">Spanish</a> and
<a href="/intro-jp.html">Japanese</a>.</small></p>
View
1  intro-es.html
@@ -9,6 +9,7 @@
<a href="/intro-fr.html">French</a>,
<a href="/intro-de.html">German</a>,
<a href="/intro-hu.html">Hungarian</a>,
+ <a href="/intro-pt-br.html">Portuguese (Brazilian)</a>,
<a href="/intro-ru.html">Russian</a> and
<a href="/intro-jp.html">Japanese</a>.</small></p>
View
1  intro-fr.html
@@ -8,6 +8,7 @@
<a href="/intro-zh.html">Chinese</a>,
<a href="/intro-de.html">German</a>,
<a href="/intro-hu.html">Hungarian</a>,
+ <a href="/intro-pt-br.html">Portuguese (Brazilian)</a>,
<a href="/intro-ru.html">Russian</a>,
<a href="/intro-es.html">Spanish</a> and
<a href="/intro-jp.html">Japanese</a>.</small></p>
View
1  intro-hu.html
@@ -8,6 +8,7 @@
<a href="/intro-zh.html">Chinese</a>,
<a href="/intro-fr.html">French</a>,
<a href="/intro-de.html">German</a>,
+ <a href="/intro-pt-br.html">Portuguese (Brazilian)</a>,
<a href="/intro-ru.html">Russian</a>,
<a href="/intro-es.html">Spanish</a> and
<a href="/intro-jp.html">Japanese</a>.</small></p>
View
1  intro-jp.html
@@ -9,6 +9,7 @@
<a href="/intro-fr.html">French</a>,
<a href="/intro-de.html">German</a>,
<a href="/intro-hu.html">Hungarian</a>,
+ <a href="/intro-pt-br.html">Portuguese (Brazilian)</a>,
<a href="/intro-ru.html">Russian</a> and
<a href="/intro-es.html">Spanish</a>.</small></p>
View
18 intro-pt-br.html
@@ -0,0 +1,18 @@
+---
+title: "Sinatra: README (German)"
+layout: default
+---
+
+<p><small>This page is also available in
+ <a href="/intro.html">English</a>,
+ <a href="/intro-zh.html">Chinese</a>,
+ <a href="/intro-fr.html">French</a>,
+ <a href="/intro-de.html">German</a>,
+ <a href="/intro-hu.html">Hungarian</a>,
+ <a href="/intro-ru.html">Russian</a>,
+ <a href="/intro-es.html">Spanish</a> and
+ <a href="/intro-jp.html">Japanese</a>.</small></p>
+
+<h1>Introdução</h1>
+
+{% include README.pt-br.html %}
View
3  intro-ru.html
@@ -9,7 +9,8 @@
<a href="/intro-fr.html">French</a>,
<a href="/intro-de.html">German</a>,
<a href="/intro-hu.html">Hungarian</a>,
- <a href="/intro-es.html">Spanish</a> and
+ <a href="/intro-es.html">Spanish</a>,
+ <a href="/intro-pt-br.html">Portuguese (Brazilian)</a> and
<a href="/intro-jp.html">Japanese</a>.</small></p>
<h1>Введение</h1>
View
1  intro-zh.html
@@ -8,6 +8,7 @@
<a href="/intro-fr.html">French</a>,
<a href="/intro-de.html">German</a>,
<a href="/intro-hu.html">Hungarian</a>,
+ <a href="/intro-pt-br.html">Portuguese (Brazilian)</a>,
<a href="/intro-ru.html">Russian</a>,
<a href="/intro-es.html">Spanish</a> and
<a href="/intro-jp.html">Japanese</a>.</small></p>
Please sign in to comment.
Something went wrong with that request. Please try again.