Agora ao criar um novo plugin para o Rails você pode adicionar suporte a internacionalização de uma forma bem simples. Basta adicionar seus arquivos de localização no diretório config/locales/**/*.{rb,yml} dentro do diretório principal do seu plugin.
Não tem muito mais o que dizer a respeito desta novidade, mas como eu estava com saudade desta série do blog resolvi voltar com algo bem simples.
Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.3.4 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades acompanhando a série Edge Rails.
Eu gosto da forma simples como os desenvolvedores do Ruby on Rails, principalmente David (dhh) resolvem as coisas que lhes incomodam. Desde a primeira versão do Rails se tornou algo comum incluir algumas linhas nas migrations para inserir alguns registros iniciais no banco de dados do projeto.
Alguns desenvolvedores até chegaram a criar projetos na tentativa de “melhorar” a forma de se fazer isso. Eu mesmo já andei usando alguns.
O que David fez, foi simplesmente adicionar um novo arquivo db/seeds.rb nos novos projetos Rails para que possamos incluir este tipo de código. Simples assim.
Depois, no momento de carregar estes registros no seu banco de dados, basta executar o seguinte comando no terminal:
O comando já existente rake db:setup também foi alterado para incluir esta funcionalidade.
No primeiro artigo desta série eu comentei sobre um dos novos recursos incluídos no Rails, chamado de Rails Metal. Agora vamos falar da funcionalidade que leva o nome “Metal”.
Imagine que você precise criar um serviço simples (como uma API pública, por exemplo) que faça uma ou duas consultas no banco de dados e devolva um string para o usuário e que precisa ser muito, muito rápido. É nestas horas que utilizaremos o Rails “Metal”, para realizar tarefas simples que precisam ser realmente rápidas.
Para criar um serviço Rails Metal devemos usar o seguinte comando:
Com isto teremos um novo diretório chamado app/metal. Nele você encontrará o arquivo poller.rb que deve se parecer com o isto:
# Allow the metal piece to run in isolation
if env["PATH_INFO"] =~ /^\/poller/
[200, {"Content-Type" => "text/html"}, ["Hello, World!"]]
else
[404, {"Content-Type" => "text/html"}, ["Not Found"]]
end
end
end
Neste modelo tudo o que ele faz é capturar as requisições feitas para /poller e retornar ‘Hello World’. Quando a requisição não for para /poller ele retornará um status 404, que indica ao sistema de rotas do Rails que ele deve assumir à partir daí, cuidando da requisição.
Para ficar mais claro, o código acima se fosse criado em um controller comum do Rails seria algo mais ou menos assim:
end
Jesse Newland fez um teste simples de performance e chegou ao seguinte resultado: Executando estes dois códigos, no modelo tradicional usando um controller comum teríamos 408.45 req/s e 2.448 ms, enquanto na versão Metal temos 1154.66 req/s e 0.866 ms. Ou seja, para um ridículo Hello World o Rails Metal se mostra 2.8x mais rápido que um Controller comum. Muito bom.
Ao subir seu projeto Rails você já terá no ar o seu serviço Rails Metal. Mas se desejar também pode subir o serviço isoladamente através da ferramenta rackup:
Usando outras ferramentas
Além do modelo proposto também podemos fazer uso de outras ferramentas afim de simplificar a criação destes serviços. Veja um exemplo retirado da especificação do Rails de um código usando o Sinatra para criar um serviço Rails Metal:
# app/metal/api.rb
Sinatra::Application.default_options.merge!(:run => false, :env => :production)
Api = Sinatra.application unless defined? Api
get '/interesting/new/ideas' do
'Hello Sinatra!'
end
Finalizando
Como podem ver teremos o melhor de dois mundo na próxima versão do Rails. Mas é importante ressaltar que mesmo sendo possível criar um projeto inteiro usando apenas o Rails Metal, isto não é uma boa coisa a se fazer. O Rails Metal é uma ferramenta com uma finalidade especifica e somente deve ser usada para casos onde a performance é crucial para o sucesso do seu software.
A noticia não é muito nova, mas eu preciso seguir uma certa linha temporal na série Edge Rails para não me perder no mar de atualizações do Ruby on Rails. Acredito que todos vocês já devem ter lido ou ouvido algo a respeito do Rails Metal, mas afinal o que é isto?

Rack: a Ruby Webserver Interface
Já faz um certo tempo que o Rails adotou o Rack, embora ainda não estivesse explorando-o como se deve. A primeira coisa feita, foi criar uma maneira simples de podermos ligar middlewares do Rack em requests do Rails. Por exemplo, se no arquivo config/environment.rb você incluir a seguinte linha:
config.middlewares.use(Rack::Cache, :verbose => true)
Isto fará com que seu aplicativo use o excelente Rack::Cache criado por Ryan Tomayko para fazer HTTP caching. Como Rack está crescendo rapidamente existe algumas dezenas ou talvez centenas de middlewares já criados, o que aumenta muito nossas opções para melhorar nossos projetos Rails.
Existe ainda outro ponto muito importante sobre o Rails Metal que precisa ser melhor explorado e esta nova característica é que leva o nome ‘Metal’. Falaremos sobre isto no próximo artigo.
Eu já comentei aqui no blog sobre o novo sistema de templates do Rails 2.3.
Com este novo recurso podemos criar um modelo para novos projetos, automaticamente instalando gems e plugins, criando e modificando arquivos, incluindo novas rotas, etc.. Mas o que dizer de projetos já existentes?
Uma nova tarefa rake foi criada para aplicar um template em um projeto existente:
Ao executar a tarefa acima, o seu template será aplicado no projeto, instalando gems e plugins, alterando arquivos e tudo o mais que você tenha preparado em seu modelo.
Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.3/3.0 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades acompanhando a série Edge Rails.
Se você é ainda um dos poucos a usar os scripts inspector, reaper e spawner do Rails, é bom saber que estes scripts não existirão mais à partir do Rails 2.3.
Eu mesmo só me lembro de usá-los uma vez em um arquivo ./script/spin que criei para subir múltiplas instâncias do Mongrel.
Como hoje a alternativa mais simples normalmente é o Passenger, estes scripts passaram a ser desnecessários na maioria dos casos. Portanto seu código foi retirado do core do Rails.
Caso você ainda precise de algum deles, foi criado um plugin chamado irs_process_scripts que os adicionará novamente em seu projeto.
Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.3/3.0 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades acompanhando a série Edge Rails.
O método Rails.root foi alterado para não mais retornar um String com o caminho físico do seu projeto Rails, mas sim um objeto do tipo Pathname.
É uma alteração simples, mas que agrega muito ao desenvolvimento. Por exemplo, veja o seguinte trecho de código:
"/app/controllers"
Ele pode ser facilmente substituído, pela nova implementação do método Rails.root, assim:
Rails.root.join("app", "controllers")
Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.3/3.0 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades acompanhando a série Edge Rails.
Já ouviu falar do plugin Quiet Backtrace criado pela Thoughtbot, a mesma galera por trás do Paperclip e Shoulda? Este plugin é muito interessante porque ele permite que você remova certas linhas do backtrace do Rails, tornando o log muito menor e simplificando a localização de problemas.
O conceito por trás deste plugin foi adicionado ao Rails. Um novo initializer chamado backtrace_silencers.rb foi criado e virá com algumas linhas de exemplo comentadas, assim:
# Be sure to restart your server when you modify this file.
# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
# You can also remove all the silencers if you're trying do debug a problem that might steem from framework code.
# Rails.backtrace_cleaner.remove_silencers!
Neste arquivo você pode incluir silenciadores e filtros para o backtrace. Por exemplo o seguinte silenciador removerá do backtrace qualquer linha que contenha a palavra mongrel:
Rails.backtrace_cleaner.add_silencer {|line| line =~ /mongrel/ }
Os filtros funcionam de uma maneira um pouco diferente, não removendo a linha, mas substituindo trechos do backtrace por alguma outra coisa. No exemplo abaixo estou fazendo com que toda vez que a palavra mongrel aparecer no backtrace ela seja substituída por ‘aeiou’:
Rails.backtrace_cleaner.add_filter {|line| line.gsub("mongrel", 'aeiou') }
Para desligar esta funcionalidade temporariamente basta tirar o comentário da linha abaixo:
Rails.backtrace_cleaner.remove_silencers!
Usado com sabedoria, este novo recurso pode se tornar uma ferramenta poderosa.
Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.3/3.0 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades acompanhando a série Edge Rails.
Atualmente não existe nenhum incentivo no Rails para a criação de testes para helpers. Quando criamos um novo modelo ou controller, o próprio script de criação já se encarrega de gerar os arquivos para testes unitários e funcionais, mas nada é criado para que possamos testar nossos helpers.
Na próxima versão do Rails ao executar um dos scripts geradores de código, como o controller, resource ou scaffold, você ganhará também um arquivo de teste pré-criado para testar seus helpers. Um novo diretório chamado helpers será criado dentro do diretório test/unit, e nele arquivos seguindo a nomenclatura [controller]_helper_test.rb conterão os testes dos seus helpers.
Veja um exemplo de um arquivo pré-criado pelo comando script/generate scaffold photos:
end
Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.3/3.0 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades acompanhando a série Edge Rails.
No Rails 2.1 em alguns casos ao se criar dois controllers com o mesmo nome, mas em namespaces diferentes um erro acontece, veja:
Mais um bug corrigido na versão 2.2.
Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.