Ich verwende Ruby on Rails 3.2.2 und möchte wissen, ob das Folgende eine "richtige" / "richtige" / "sichere" Methode ist, um eine Setter-Methode für ein my class-Attribut zu überschreiben.
attr_accessible :attribute_name
def attribute_name=(value)
... # Some custom operation.
self[:attribute_name] = value
end
Der obige Code scheint wie erwartet zu funktionieren. Aber ich möchte , wenn, wissen , durch den obigen Code verwendet wird , in Zukunft werde ich Probleme hat , oder zumindest, welche Probleme „soll ich erwarten“ / mit Ruby „könnte passieren“ on Rails . Wenn dies nicht der richtige Weg ist, eine Setter-Methode zu überschreiben, was ist der richtige Weg?
Hinweis : Wenn ich den Code verwende
attr_accessible :attribute_name
def attribute_name=(value)
... # Some custom operation.
self.attribute_name = value
end
Ich erhalte folgende Fehlermeldung:
SystemStackError (stack level too deep):
actionpack (3.2.2) lib/action_dispatch/middleware/reloader.rb:70
Antworten:
================================================== ========================= Update: 19. Juli 2017
In der Rails-Dokumentation wird nun auch vorgeschlagen, Folgendes zu verwenden
super
:================================================== =========================
Ursprüngliche Antwort
Wenn Sie die Setter-Methoden für Spalten einer Tabelle beim Zugriff über Modelle überschreiben möchten, können Sie dies auf diese Weise tun.
Siehe Überschreiben von Standard-Accessoren in der Rails-Dokumentation.
Ihre erste Methode ist also die richtige Methode, um Spaltensetzer in Ruby of Rails-Modellen zu überschreiben. Diese Accessoren werden bereits von Rails bereitgestellt, um auf die Spalten der Tabelle als Attribute des Modells zuzugreifen. Dies nennen wir ActiveRecord ORM-Mapping.
Denken Sie auch daran, dass die
attr_accessible
Oberseite des Modells nichts mit Accessoren zu tun hat. Es hat eine ganz andere Funktion (siehe diese Frage )Wenn Sie in reinem Ruby Accessoren für eine Klasse definiert haben und den Setter überschreiben möchten, müssen Sie die folgende Instanzvariable verwenden:
Dies wird leichter zu verstehen sein, wenn Sie wissen, was
attr_accessor
tut. Der Codeattr_accessor :name
entspricht diesen beiden Methoden (Getter und Setter).Auch Ihre zweite Methode schlägt fehl, da sie eine Endlosschleife verursacht, wenn Sie dieselbe Methode
attribute_name=
innerhalb dieser Methode aufrufen .quelle
attr_accessible
da es nicht mehr da ist und es funktionieren solltesuper
?super
möglicherweise nicht funktionieren. Aber es scheint nicht der Fall zu sein. Ich habe es gerade überprüft und es funktioniert für mich. Auch diese Frage stellen das gleichewrite_attribute
. Konvertierungen werden übersprungen. Beachten Sie, dasswrite_attribute
Zeitzonen-Konvertierungen mit Datumsangaben übersprungen werden, was fast immer unerwünscht ist.Verwenden Sie das
super
Schlüsselwort:Um den Leser zu überschreiben:
quelle
In Schienen 4
lassen Sie sagen , Sie haben Altes Attribut in der Tabelle
Hinweis: Für Neuankömmlinge in Rails 4 müssen Sie im Modell nicht attr_accessible angeben . Stattdessen müssen Sie Ihre Attribute auf Controller-Ebene mithilfe der Genehmigungsmethode auf die weiße Liste setzen .
quelle
Ich habe festgestellt, dass (zumindest für ActiveRecord-Beziehungssammlungen) das folgende Muster funktioniert:
(Dies erfasst die ersten 3 nicht doppelten Einträge im übergebenen Array.)
quelle
Verwenden
attr_writer
zum Überschreiben des Setters attr_writer: attribute_namequelle