Verwenden von attr_accessor und attr_accessible für dasselbe Feld
Was passiert im hintergrund mit dem folgenden code?
class User < ActiveRecord::Base
attr_accessor :name
attr_accessible :name
end
Hinweis: Beim instanzieren der Klasse, wird es beibehalten werden, um die Datenbank? Warum oder warum nicht?
InformationsquelleAutor der Frage Magne | 2011-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
attr_accessor ist ruby-code und wird verwendet, wenn Sie nicht über eine Spalte in der Datenbank, aber immer noch wollen, um zu zeigen, ein Feld in Ihren Formularen. Der einzige Weg, um dies zu ermöglichen, ist
attr_accessor :fieldname
- und Sie können dieses Feld verwenden, in der Sie Ihre Ansicht oder ein Modell, wenn Sie wollte, aber vor allem in Ihrer Ansicht.attr_accessible können Sie eine Liste aller Spalten, die Sie zulassen möchten, dass der Masse die Abtretung, als andy entzog nach oben. Das Gegenteil davon ist attr_protected was bedeutet dieses Feld, ich möchte NICHT, dass jemand sein darf, der Masse Zuordnen. Mehr als wahrscheinlich, es wird auf ein Feld in Ihrer Datenbank, die Sie nicht wollen, dass jemand monkeying herum mit. Wie ein status-Feld, oder so ähnlich.
InformationsquelleAutor der Antwort pjammer
In den meisten Fällen, Sie brauchen nicht zu verwenden
attr_accessor
wenn das Feld eine Spalte in derusers
Tabelle in Ihrer Datenbank. ActiveRecord wird es für Sie herausfinden.attr_accessible
einfach ermöglicht-Feld zugeordnet werden, die per Massen-Zuordnung (z.B. mitupdate_attributes
). Das ist gut für die Sicherheit. Weitere Informationen aus der MassAssignmentSecurity API-docs.InformationsquelleAutor der Antwort Andy Lindeman
Danke an alle für schnelle Antworten!
Ihre Antworten kombiniert gab mir die Teile, die ich brauchte, um zu verstehen, dieses Rätsel, finde ich.
(In einem verwandten problem, ich wurde immer eine Menge von null-Fehler "Object doesn' T support #inspizieren" und "undefined method 'Schlüssel' für nil:NilClass". Ich konnte es lösen, jetzt, durch entfernen der att_accessor Gebiet insgesamt.)
Durch das Experimentieren mit diesem besonderen Fall, das ist, was ich herausgefunden habe:
Eigentlich die :name-Feld wird nicht persistent auf der Datenbank.
Wird nur setzen Sie das Attribut auf das Objekt, aber nicht beibehalten werden :name der Spalte in der Datenbank. Wie die folgenden Schienen-Konsole " - Ausgabe zeigt:
Ich nehme an, dies ist, weil *die setter-made by attr_accessor überschreiben ActiveRecord - setter* (die kümmert sich um die Datenbank-Persistenz). Sie können immer noch abrufen des Wertes aus der :name-Feld von dem Objekt, obwohl, wie diese:
So, zum Schluss, ich habe gelernt, dass mit attr_accessor auf den Feldern führen könnten, die nicht persistent auf der Datenbank. Und während ich dachte, attr_accessible beschreibt die Felder in der Datenbank, sollte von außen zugänglich sein, es scheint nicht, einen Unterschied zu machen in diesem Fall.
InformationsquelleAutor der Antwort Magne
Da es erbt
ActiveRecord
wird, wird es beibehalten, wenn Sie rufen Sie diesave
Methode (aber nicht, wenn es instanziiert wird).Wenn Sie keine Attribute für das Modell, ich nehme an
ActiveRecord
wird, speichern Sie einfach eine neue Zeile in die Datenbank (d.h. Ihr Objekt wird nur einer beibehaltenid
). Dies macht Sinn, da Sie eventuell zu einem späteren Zeitpunkt hinzufügen von Attributen, die IhreUser
Modell, und den persistenten Instanzen sollte noch abrufbar sein.InformationsquelleAutor der Antwort David Sulc