================================================== =========================
Actualización: 19 de julio de 2017
Ahora la documentación de Rails también sugiere usar super
así:
class Model < ActiveRecord::Base
def attribute_name=(value)
# custom actions
###
super(value)
end
end
================================================== =========================
Respuesta original
Si desea anular los métodos de establecimiento de columnas de una tabla mientras accede a través de modelos, esta es la forma de hacerlo.
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 Anulación de accesos predeterminados en la documentación de Rails.
Entonces, su primer método es la forma correcta de anular los establecedores de columnas en Modelos de Ruby on Rails. Rails ya proporciona estos accesorios para acceder a las columnas de la tabla como atributos del modelo. Esto es lo que llamamos mapeo ActiveRecord ORM.
También tenga en cuenta que la attr_accessible
parte superior del modelo no tiene nada que ver con los accesorios. Tiene una funcionalidad completamente diferente (ver esta pregunta )
Pero en Ruby puro, si ha definido los accesores para una clase y desea anular el setter, debe utilizar una variable de instancia como esta:
class Person
attr_accessor :name
end
class NewPerson < Person
def name=(value)
# do something
@name = value
end
end
Esto será más fácil de entender una vez que sepa lo que attr_accessor
hace. El código attr_accessor :name
es equivalente a estos dos métodos (getter y setter)
def name # getter
@name
end
def name=(value) # setter
@name = value
end
Además, su segundo método falla porque causará un bucle infinito ya que está llamando al mismo método attribute_name=
dentro de ese método.