=================================================== ==========================
Mise à jour: 19 juillet 2017
Maintenant, la documentation Rails suggère également d'utiliser super
comme ceci:
class Model < ActiveRecord::Base
def attribute_name=(value)
# custom actions
###
super(value)
end
end
=================================================== ==========================
Réponse originale
Si vous souhaitez remplacer les méthodes de définition des colonnes d'une table lors de l'accès via des modèles, c'est la manière de le faire.
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
Voir Remplacer les accesseurs par défaut dans la documentation Rails.
Donc, votre première méthode est la bonne façon de remplacer les setters de colonne dans Models of Ruby on Rails. Ces accesseurs sont déjà fournis par Rails pour accéder aux colonnes de la table en tant qu'attributs du modèle. C'est ce que nous appelons le mappage ORM ActiveRecord.
Gardez également à l'esprit que la partie attr_accessible
supérieure du modèle n'a rien à voir avec les accesseurs. Il a une fonctionnalité complètement différente (voir cette question )
Mais en Ruby pur, si vous avez défini des accesseurs pour une classe et que vous souhaitez remplacer le setter, vous devez utiliser une variable d'instance comme celle-ci:
class Person
attr_accessor :name
end
class NewPerson < Person
def name=(value)
# do something
@name = value
end
end
Cela sera plus facile à comprendre une fois que vous saurez ce que attr_accessor
fait. Le code attr_accessor :name
est équivalent à ces deux méthodes (getter et setter)
def name # getter
@name
end
def name=(value) # setter
@name = value
end
De plus, votre deuxième méthode échoue car elle provoquera une boucle infinie lorsque vous appelez la même méthode attribute_name=
dans cette méthode.