Uma das novidades mais bacanas da nova versão do Rails é o uso de modelos para criação de novos projetos, os chamados Application Templates. Com eles, você pode configurar toda a estrutura padrão do seu projeto, como plugins, gems, arquivos de inicialização, configurar git e tudo mais, em um arquivo .rb reutilizável. O Carlos Brando postou sobre isso aqui e aqui, antes mesmo da versão 2.3.2 ser lançada.
A ideia é simples. Ao criar um novo projeto, indicamos o caminho para o template com a opcão -m ao comando rails.
rails minha_app -m /caminho/para/o/template.rb
Se for um projeto já existente, existe uma rake para aplicar o template.
rake rails:template LOCATION=/caminho/para/o/template.rb
Na página do autor existe um exemplo de um template bem simples:
run "rm public/index.html"
generate(:scaffold, "person name:string")
route "map.root :controller => 'people'"
rake("db:migrate")
git :init
git :add => "."
git :commit => "-a -m 'Initial commit'"
Dá para perceber que seu uso é bem intuitivo. Esse template remove o arquivo public/index.html, cria um scaffold Person, mapeia a rota inicial para PeopleController e roda a migração. Depois inicializa o repositório git e commita tudo. Legal, né?!
Outros templates podem ser obtidos aqui e aqui.
Bom, mas a idéia desse post é criarmos nosso próprio template.
Como várias pessoas usam o brazlian-rails em seus projetos, vamos aqui criar nosso template configurando para tal.
Primeiro vamos configurar as gems. Crie um arquivo ruby chamado brazilian-rails-template.rb e adicione o código abaixo.
#brazilian-rails-template.rb gem "brdinheiro", :version => ">= 2.1.6" gem "brcep", :version => ">= 2.1.6" gem "brcpfcnpj", :version => ">= 2.1.6" gem "brdata", :version => ">= 2.1.6" gem "brdinheiro", :version => ">= 2.1.6" gem "brhelper", :version => ">= 2.1.6" gem "brnumeros", :version => ">= 2.1.6" gem "brstring", :version => ">= 2.1.6" gem "brI18n", :version => ">= 2.1.6"
O uso de :version é totalmente opcional. Assim como as opções :source e :lib.
Lembre-se que o método gem() não instala as gems para você. Se quiser fazê-lo, adicione a linha abaixo ao seu arquivo.
rake "gems:install"
Qualquer rake task pode ser executada. Caso precise permissões de sudo para rodar alguma delas, use a opção :sudo => true. Existe, ainda, a opção :env para você setar qual ambiente deseja que a rake seja executada. Por exemplo:
rake "db:migrate", :env => "test"
Existe também o método plugin(), para configurar, advinhem?, seus plugins.
Ok, voltemos para nosso template.
Uma vez que a internacionalização do brazilian-rails é, por padrão, desabilitada, precisamos que nosso template carregue o suporte a I18n da gem brI18n. Uma forma de fazer isso é criar um arquivo dentro de config/initializers que faça a chamada à require ‘brI18n’. Isso pode ser feito assim:
#brazilian-rails-template.rb #... initializer "load_brI18n.rb", <<-CODE require 'brI18n' CODE
O método initializer() cria um arquivo dentro de config/initializers/ com o nome passado com argumento. O último argumento vai ser impresso dentro do arquivo recém criado. A mesma ideia serve para o método lib(), que gera um arquivo dentro da pasta lib/, e para vendor(), dentro de vendor/. Existe, ainda, o file(), que gera o arquivo em um caminho absoluto:
file "app/components/foo.rb", <<-CODE class Foo end CODE
Legal, assim já temos as gems configuradas. Vamos agora para o git.
#brazilian-rails-template.rb
#...
git :init
file '.gitignore', <<-CODE
log/*.log
log/*.pid
db/*.db
db/*.sqlite3
db/schema.rb
tmp
.DS_Store
doc/api
doc/app
config/database.yml
nbproject
CODE
inside("config") do
run "cp database.yml database.yml.sample"
end
Aqui iniciei o repositório git e criei o arquivo .gitignore com o file(). Note que usei o método run(), dentro de inside() para executar o comando ‘cp‘ no diretório config.
Meu amigo João Vitor me ensinou que é um boa prática nunca versionar o arquivo database.yml, então joguei ele (o arquivo, não meu amigo João
dentro de .gitignore e versionei sua cópia inicial.
Bom, mas talvez nem sempre seja interessante fazer isso. Que tal perguntar ao usuário se ele desejar fazer uma cópia do database.yml? Para esse tipo de interação, existe o método yes?(), que recebe uma string como argumento, a imprime na tela e espera uma resposta “y” ou “yes” para sim e qualquer coisa diferente para não.
#brazilian-rails-template.rb
#...
git :init
file '.gitignore', <<-CODE
log/*.log
log/*.pid
db/*.db
db/*.sqlite3
db/schema.rb
tmp
.DS_Store
doc/api
doc/app
config/database.yml
nbproject
CODE
if yes?("Deseja fazer uma cópia de config/database.yml?")
run "cp config/database.yml config/database.yml.sample"
end
Pronto, melhor assim. Agora é só comitar
#brazilian-rails-template.rb #... git :add => "." git :commit => "-a -m 'Initial commit'"
Por fim, nosso brazilian-rails-template.rb vai ficar assim:
gem "brdinheiro", :version => ">= 2.1.6"
gem "brcep", :version => ">= 2.1.6"
gem "brcpfcnpj", :version => ">= 2.1.6"
gem "brdata", :version => ">= 2.1.6"
gem "brdinheiro", :version => ">= 2.1.6"
gem "brhelper", :version => ">= 2.1.6"
gem "brnumeros", :version => ">= 2.1.6"
gem "brstring", :version => ">= 2.1.6"
gem "brI18n", :version => ">= 2.1.6"
initializer "load_brI18n.rb", <<-CODE
require 'brI18n'
CODE
git :init
file '.gitignore', <<-CODE
log/*.log
log/*.pid
db/*.db
db/*.sqlite3
db/schema.rb
tmp
.DS_Store
doc/api
doc/app
config/database.yml
nbproject
CODE
if yes?("Deseja fazer uma cópia de database.yml?")
run "cp config/database.yml config/database.yml.sample"
end
git :add => "."
git :commit => "-a -m 'Initial commit'"
Esse template está no GitHub, fique a vontade para alterá-lo.
Se preferir, você pode apontar diretamente para o Gist:
rails minha_app -m http://gist.github.com/90973.txt
E é isso.
Abraços e bons códigos!

Muito bom o artigo parabéns e sucesso
Opa, Maykon, valeu!
Fala Uhoa!!!! Tá famoso hein? na ruby-br e tudo .. mandando bem!!
Qnd tu vem pro rio?
abraço!