Gibt es eine Möglichkeit, um Rails-ActiveRecord-Attribute private?
Standardmäßig, ActiveRecord nimmt alle Felder aus der entsprechenden Datenbank-Tabelle und erstellt die öffentlichen Attribute, die für alle von Ihnen.
Ich denke, es ist vernünftig nicht, um alle Attribute in einem Modell der öffentlichkeit. Noch mehr, daß Attribute, die eigentlich für den internen Gebrauch clutters das Modell s-Schnittstelle und verstößt gegen das Prinzip der Kapselung.
Gibt es also einen Weg, um einige der Attribute buchstäblich private
?
Oder, vielleicht sollte ich weiter mit einigen anderen ORM -?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jordini war auf dem besten Weg dorthin
Meisten active_record passiert in method_missing. Wenn Sie die Methode bestimmen, nach vorne wird es nicht treffen method_missing für diese Methode, und verwenden Sie Ihnen in Stelle (effektiv überschreiben, aber nicht wirklich)
your_model_instance[:my_private_attribute] = "Foo"
und ändern Sie den Wert des Attributs. Sehr hässlich!your_model_instance.send(:my_private_attribute=, "foo")
. Ruby nimmt die (vernünftige) Herangehensweise, dass das Ziel der Schutz der Privatsphäre ist ein Kennzeichen in der Absicht, andere Programmierer, nicht wie ein Schloss, kann niemals gebrochen werden.def my_private_attribute; super end
tun - keine Notwendigkeit, neu zu definieren, dann natürlich machen es die privaten wie oben oder in meine bevorzugte Artprivate :my_private_attribute
gut, man konnte immer überschreiben der Methoden...
Stolperte über diese vor kurzem. Wenn Sie möchten, eigenem schreiben und Lesen und der öffentlichkeit Lesen so etwas wie dieses
scheint zu funktionieren für mich. Sie kann Geige mit attr_reader, attr_writer und attr_accessor zu entscheiden, was sollte ausgesetzt werden, und was soll privat sein.
your_model_instance[:my_private_attribute] = "Foo"
und ändern Sie den Wert des Attributs. Sehr hässlich!Können Sie eine vorhandene Methode private:
Für mich Methoden aus beiden Otto und jordinl funktionieren und machen rspec für ein Objekt der Klasse übergeben:
Aber wenn ich jordinl Methode, ich habe eine veraltete Nachricht nicht in Datenbank schreiben direkt an, sondern attr_writer statt.
UPDATE:
Aber die wirklich "richtigen" metod zu tun, es stellt sich heraus, dass einfach. Dank Mladen Jablanović und Christopher Creutzig von hier aus. Um vordefinierte Methode als privat oder geschützt... einfach neu definieren:
Was wichtig ist, Sie brauchen sich nicht umschreiben, die zuvor definierte Methode der Logik.
Machen die Einstellung private bedeutet generieren ActiveRecord Fehler.
Legte ich access control code in der überschrieben Methode der öffentlichen setter durch die überprüfung der Anrufer:
Ich glaube nicht, dass es 100% zuverlässigen Weg, dies zu tun. Es lohnt sich auch die überprüfung der beliebtesten Möglichkeiten, um auf die Attribute zuzugreifen:
http://www.davidverhasselt.com/set-attributes-in-activerecord/