
Já faz um tempo que estou ensaiando um plugin, mas como quase tudo no Rails, um plugin só vale a pena quando é extraído de uma necessidade real. Foi isto que aconteceu ontem. Há alguns dias atrás eu mencionei aqui na série edge rails sobre uma alteração no sistema de rotas do Rails permitindo que incluíssemos uma opção :as no map.resources para dar um apelido ao modelo. Isto nos permitiria fazer algo assim:
map.resources :products, :as => 'produtos' do |product|
product.resources :product_reviews, :as => 'comentarios'
end
E depois acessar usando a URL:
http://www.meusite.com/produtos/123/comentarios
Em nosso bom e velho português. O que é uma necessidade no caso de sistemas 100% brasileiros e com público alvo nacional. Seria meio estranho um sistema inteiro em português com URLs em inglês, além de dificultar para alguns usuários, e atrapalhar um pouco o SEO.
Eu estou envolvido em um projeto pessoal nas horas vagas (que aliás está demorando muito . porque minhas horas vagas são poucas) onde eu precisava exatamente disto. Eu sei que na próxima versão do Rails teremos isto, mas eu não posso esperar, por isto acabei criando um plugin, que faz a mesma coisa, mas que pode ser usado nas versões atuais do Rails. Eu testei nas versãos 2.0.2 e 1.2.6 e tudo funciona tranquilamente.
Uma das vantagens de se usar este plugin é que ele contém exatamente o mesmo código do edge rails, então se no futuro você migrar para a versão 2.x.x do Rails, você poderá remover o plugin e suas rotas continuarão funcionando normalmente.
Se você tem um software nas versões mais antigas do Rails, como a 1.2.6, por exemplo, você também pode usar o plugin, sem precisar migrar para o Rails 2.0.
O plugin contém uma boa suíte de testes. Ao todo são 49 testes com 3068 assertions, que cobrem todo tipo de teste envolvendo rotas. Se você estiver usando uma versão diferente da 2.0.2 e 1.2.6 eu peço que rode os teste executando o comando abaixo para se certificar de que tudo irá funcionar na sua versão também:
rake test:plugins
E finalmente, para instalar o plugin basta executar o seguinte comando de dentro da sua aplicação Rails:
./script/plugin install http://plugins.nomedojogo.com/custom_resource_name
O comando acima é tudo em uma linha só do terminal. Qualquer dúvida ou problema podem entrar em contato comigo pelo formulário de contato ou deixar o seu comentário neste post.
Nao entendi muito bem por que “traduzir” o nome das rotas. Se eu tiver um model com nome produto ao inves de product e estiver utilizando brazilian rails por exemplo isso ja nao e feito automaticamente?
Daniel, eu não estou traduzindo o nome da rota, estou dando um apelido à elas, só isso. Meu código continuará todo em inglês (o que é uma boa prática) mas minhas rotas podem ser acessadas em português.
Eu continuo usando por exemplo product_path ou product_url e continuo com um modelo Product em toda minha aplicação. Mas minha url será algo como http://meusite.com/produtos
Eu acho horrível ter de escrever usuarios_path, meio inglês, meio português… coisa feia…
Com este plugin vc continua com o seu user_path normalmente, o que muda é somente a url que deixa ser ser algumacoisa.com/users para ser algumacoisa.com/usuarios de forma transparente, sem ter de alterar absolutamente nada em seu código e sem assassinar o código misturando inglês e português.
Alias eu acho que todo programador deveria escrever código somente em inglês, mas aí é outra história…
Carlos,
Muito bom! Parabéns!
Parabéns pela iniciativa. Estava penando para saber como iria fazer isso em um projeto aqui.
Também não gosto de ficar misturando inglês com português.
Muito bom… antigamente eu fazia isso tambem mas de um modo meio mobraw… assim fica bem mais fácil de entender!
:D
Já que é só um caso de apelidar um resource já implementaram isso no dev do rails, o código está disponível em diff:
http://dev.rubyonrails.org/ticket/10578
Eu uso ele (:path_substitute) e funciona perfeitamente.
Hmm… Leandro, o código que estou usando é exatamente o mesmo código do trunk do rails (eu falei isto acima), o que fiz foi montar o plugin e adaptar os testes e fazer funcionar nas versões anteriores ao Rails 2.0. E como expliquei eu fiz isto com a mesma finalidade que você, para poder usar sem ter de esperar sair a versão 2.0.3 (?) e sem ter usar a versão edge que é instável.
Como eu fiz para mim, nada mais justo do que liberar para quem também precisa, evitando o trabalho de aplicar o patch manualmente, como nós dois fizemos. Fazer isto também é legal, porque no futuro, quando sair a nova versão do Rails, se você migrar seu projeto, basta remover o plugin e tudo vai continuar funcionando normalmente.
Aliás, o patch que você mencionou é o mesmo que usei como base, mas você deve ter usado uma versão mais antiga dele, verifique novamente e veja que não será mais usado o :path_substitute e sim :as como está neste plugin, neste caso é melhor você reaplicar o patch ou user o meu plugin, senão terá problemas em uma futura migração.
Grande abraço!
O plugin é EXATAMENTE o que eu estava precisando no momento. Estou desenvolvendo em ingles e o cliente pediu que tudo fosse em português. Em menos de 30 minutos matei a charada. A utilização é muito simples e funciona maravilhosamente bem na versão 1.2.3 que é a que estamos utilizando neste projeto.
Perfeito!! Um grande abraço!!
Obrigado Vinícius. Fico feliz de ter ajudado. Você rodou os testes? Tudo funcionou nesta versão?
Ótimo, simplesmente lindo…. realmente é muito estranho as urls em inglês.
Parabéns! O plugin é excelente. Como o Davia comentou, também procurava uma idéia para manter o código em inglês e somente as rotas em português. Excelente plugin.
No que for necessário, gostaria de permissão para adicionar novas features.
Um abraço.
Hallison,
Se tiver alguma idéia interessante, entre em contato comigo pelo formulário de contatos do blog.