================================================== =========================
Aggiornamento: 19 luglio 2017
Ora la documentazione di Rails suggerisce anche di usare in super
questo modo:
class Model < ActiveRecord::Base
def attribute_name=(value)
# custom actions
###
super(value)
end
end
================================================== =========================
Risposta originale
Se si desidera sovrascrivere i metodi setter per le colonne di una tabella durante l'accesso attraverso i modelli, questo è il modo per farlo.
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
Vedere Sostituzione degli accessori predefiniti nella documentazione di Rails.
Quindi, il tuo primo metodo è il modo corretto di sovrascrivere i setter di colonne in Models of Ruby on Rails. Questi accessor sono già forniti da Rails per accedere alle colonne della tabella come attributi del modello. Questo è ciò che chiamiamo mappatura ORM di ActiveRecord.
Inoltre, tieni presente che la attr_accessible
parte superiore del modello non ha nulla a che fare con gli accessori. Ha una funzionalità completamente diversa (vedi questa domanda )
Ma in puro Ruby, se hai definito gli accessori per una classe e vuoi sovrascrivere il setter, devi usare la variabile di istanza in questo modo:
class Person
attr_accessor :name
end
class NewPerson < Person
def name=(value)
# do something
@name = value
end
end
Questo sarà più facile da capire una volta che sai cosa attr_accessor
fa. Il codice attr_accessor :name
è equivalente a questi due metodi (getter e setter)
def name # getter
@name
end
def name=(value) # setter
@name = value
end
Anche il tuo secondo metodo fallisce perché causerà un ciclo infinito mentre stai chiamando lo stesso metodo attribute_name=
all'interno di quel metodo.