Rails 2.2: alias_attribute funcionando com Dirty Objects

30 de outubro de 2008  |  Rails 2.2  | 

Para entender esta alteração, vamos precisar analisar o mesmo código sendo executado em uma versão anterior do Rails e depois no Rails 2.2. Vamos pegar um modelo como exemplo:

class Comment < ActiveRecord::Base
  alias_attribute :text, :body
end

Note que estou usando o método alias_attribute para criar um alias para o atributo body com o nome de text. Na teoria este método deveria replicar todos os métodos de leitura, escrita, pesquisa e qualquer outro que envolva o atributo body. Mas vejamos um exemplo sendo executado no Rails 2.1 ou anterior:

c = Comment.first
# => #<Comment id: 1, body: "my comment">

c.body
# => "my comment"

c.text
# => "my comment"

c.body = "a new message"
# => "a new message"

c.body_changed?
# => true

c.text_changed?
# => NoMethodError: undefined method `text_changed?' ...

Ao executar o método text_changed? temos um erro, porque o alias_attribute não estava replicando os métodos de rastreamento, mas isto já foi corrigido. Veja o mesmo código executado agora em um projeto Rails 2.2:

c = Comment.first
# => #<Comment id: 1, body: "my comment">

c.body
# => "my comment"

c.text
# => "my comment"

c.body = "a new message"
# => "a new message"

c.body_changed?
# => true

c.text_changed?
# => true

c.text_change
# => ["my comment", "a new message"]

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



10 Comentários


  1. ???

    c.text_changed?
    # => true

    não deveria ser?:

    c.text_changed?
    # => false
  2. Leonardo,

    não, o correto é true mesmo.

  3. Carlos, o método alias_attribute já existe no Rails 2.1.2? Estranhamente eu o utilizei aqui e ele não funcionou. De qualquer forma acabei descobrindo aqui um novo método que me parece ser bem útil: attribute_changed?.

  4. Ele existe desde o Rails 2.1.0.

  5. Carlos, obrigado pelo esclarecimento. Devo estar fazendo algo errado aqui. Uma das coisas que me fez duvidar da presença do alias_attribute, além do fato dele não ter funcionado comigo, é a ausência dele na documentação do Rails, mas ele deve ser incluído em breve então.

  6. Antes de comentar eu procurei no Google e achei essa página, mas como tenho o http://api.rubyonrails.org/ como documentação oficial da API do Rails , considerei que não tinha ainda na documentação.

    A propósito, o http://api.rubyonrails.org/ deve ser mesmo considerado a documentação oficial da API do Rails?

  7. Imaginei mesmo que o http://api.rubyonrails.org/ estava meio ultrapassado.

    Obrigado novamente pelo esclarecimento, Carlos.

Deixe um comentário