==================================================== =========================
Atualização: 19 de julho de 2017
Agora a documentação do Rails também está sugerindo o uso super
assim:
class Model < ActiveRecord::Base
def attribute_name=(value)
# custom actions
###
super(value)
end
end
==================================================== =========================
Resposta original
Se você deseja substituir os métodos setter para colunas de uma tabela enquanto acessa através de modelos, esta é a maneira de fazê-lo.
class Model < ActiveRecord::Base
attr_accessible :attribute_name
def attribute_name=(value)
# custom actions
###
write_attribute(:attribute_name, value)
# this is same as self[:attribute_name] = value
end
end
Consulte Substituindo acessadores padrão na documentação do Rails.
Portanto, seu primeiro método é a maneira correta de substituir os configuradores de coluna em Models of Ruby on Rails. Esses acessadores já são fornecidos pelo Rails para acessar as colunas da tabela como atributos do modelo. Isso é o que chamamos de mapeamento ActiveRecord ORM.
Lembre-se também de que a attr_accessible
parte superior do modelo não tem nada a ver com os acessadores. Possui uma funcionalidade completamente diferente (consulte esta pergunta )
Porém, no Ruby puro, se você definiu acessadores para uma classe e deseja substituir o setter, deve usar a variável de instância como esta:
class Person
attr_accessor :name
end
class NewPerson < Person
def name=(value)
# do something
@name = value
end
end
Isso será mais fácil de entender quando você souber o que attr_accessor
faz. O código attr_accessor :name
é equivalente a esses dois métodos (getter e setter)
def name # getter
@name
end
def name=(value) # setter
@name = value
end
Além disso, seu segundo método falha porque causa um loop infinito quando você está chamando o mesmo método attribute_name=
dentro desse método.