O Ruby on Rails é um dos frameworks que mais aplica o paradigma Convention over Configuration em sua estrutura.
O intuito desse paradigma é fazer com que o programador só precise configurar (especificar) os aspectos da sua aplicação que não seguem a convenção da linguagem. Sendo assim se ele sempre seguir a convenção ele não precisa efetuar nenhuma configuração adicional.
Por exemplo, o Rails possui uma convenção de que classes devem possuir nomes no singular e, as respectivas tabelas no banco de dados, devem possuir o mesmo nome no plural. Se você criar uma classe House, o Ruby on Rails vai entender que a tabela correspondente para salvar os registros da classe House no banco de dados é a tabela Houses, no plural.
Caso você deseje utilizar uma tabela com outro nome para esse propósito, você terá que configurá-la manualmente. Mas caso você aceite a convenção do Rails e utilize o nome da tabela como Houses, então você não precisará configurar nada, apenas digite house.save e o Rails irá salvar o registro na tabela correspondente (bem mais prático).
O porque de toda essa explicação.
Para saber qual o nome da tabela correspondente no banco de dados, o Rails faz uso do método pluralize.
Esse método recebe uma string como argumento e retorna uma outra string com o plural da palavra recebida.
Faça um teste, abra o diretório do seu projeto pelo console do Linux / Mac e digite:
script/console
Isso abrirá um console parecido com o IRB, mas com todo o ambiente do Rails carregado junto a ele.
Nesse console digite, por exemplo:
"house".pluralize
"child".pluralize
"person".pluralize
Os resultados serão
"houses"
"children"
"people"
Viram, o Rails sabe trabalhar até com plurais irregulares do inglês.
Mas, como eu disse, o Rails só sabe trabalhar com inglês. Por exemplo, se você digitar "imagem".pluralize o resultado será "imagems" e não "imagens".
Meu objetivo nesse post é ensinar uma forma rápida de se configurar regras de pluralização em outras línguas no Rails.
É lógico que hoje em dia existem plugins / gems para o Rails que contém todas as regras de pluralização em português (Brazilian Rails), mas vamos dizer que você só precise de uma ou duas para um projeto ou um teste que você está fazendo. Vou explicar como fazer.
Configurando regras de pluralização.
O processo é bem simples, abra com um editor de texto ou IDE o arquivo que está dentro da pasta do seu projeto em:
./config/initializers/inflections.rb
Descomente as linhas:
ActiveSupport::Inflector.inflections do |inflect|
e
end
(Se elas não estiverem comentadas simplesmente digite-as).
Dentro deste bloco digite as regras que deseja. Dentro do arquivo inflections.rb existem alguns exemplos de regras (comentados). Segue uma de exemplo:
inflect.irregular 'imagem', 'imagens'
Seu arquivo deve ficar assim:
ActiveSupport::Inflector.inflections do |inflect|
inflect.irregular 'imagem', 'imagens'
end
Basta salvar e reiniciar o console (ou o servidor, depende de onde você estiver testando) e já estará funcionando.
Pessoal, espero ter ajudado, qualquer dúvida sintam-se livres para perguntar.
terça-feira, 27 de janeiro de 2009
Assinar:
Postar comentários (Atom)


2 comentários:
exatamente oq eu procurava. obrigado por compartilhar.
Opa,
Sei que é meio antigo mas ainda funciona, ontem eu estava fazendo algo parecido. Mas estava pensando em usar regras com regex. Eu usei inflect.plural(/(.*)al$/i, '\1ais') para pluralizar real -> reais, animal -> animais, ou seja, tudo que termine com al colocar ais. No começo funcionou perfeito para o que eu queria mas dae veio a dúvida sobre os models e controllers.
Criei uma regra que tratasse disso para o meu teste tinha um model InternationalWaybill e criei a seguinte regra inflect.plural(/(.*)ll$/i, '\1foo'). Alterou o final do nome para foo ficando international_waybifoo dando erro dizendo que a tabela não existe.
Claro que não existe heheheh!!
Você saberia se tem alguma forma de desconsiderar quando tenta traduzir models para tabelas!?
Ou somente criando uma lista de palavras "irregulares". inflect.irregular 'real', 'reais'...
Valew pelo post... abs Targa
Postar um comentário