Carlos Brando

Nome do Jogo

Rails 2.2: Novas opções para o método composed_of

O método composed_of recebeu duas novas opções: :constructor e :converter.

A opção :constructor pode receber um simbolo com o nome de um método ou um Proc. Por padrão, a classe de composição é criada através do método new, recebendo todos os atributos mapeadas como parâmetros, exatamente na ordem que em foram mapeados. Se por algum motivo a sua classe não aceitar esta convenção, você deve fazer uso da opção :constructor. Com ela você pode alterar a forma como sua classe deve ser criada. Veja um exemplo retirado da própria documentação do Rails:

composed_of :ip_address,
  :class_name => 'IPAddr',
  :mapping => %w(ip to_i),
  :constructor => Proc.new { |ip| IPAddr.new(ip, Socket::AF_INET) }

No exemplo, como você pode ver, ao criar uma nova instancia da classe IPAddr é necessário informar mais um parâmetro ao construtor. Fazendo uso da opção :constructor isto se torna bem simples.

Quanto a opção :converter, ela também aceita um simbolo que represente um método da classe informada na opção :class_name ou um Proc, e é disparado quando um valor diferente de uma instância da classe informada for passado para a propriedade criada, o que torna necessário uma conversão. Mais um exemplo:

composed_of :balance,
  :class_name => "Money",
  :mapping => %w(balance amount),
  :converter => Proc.new { |balance| Money.parse(balance) }

No exemplo acima o método balance= sempre estará esperando por uma instancia da classe Money, mas caso um outro tipo de objeto seja informado ele deverá ser convertido usando o método parse do objeto Money.

Com esta nova opção não devemos mais usar o bloco de conversão que o método permitia antes, a conversão sempre deve ser feita através do uso da opção :converter.


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?”.

Comments