Was ist in Rails der Unterschied zwischen attr_accessor
und attr_accessible
? Nach meinem Verständnis wird using attr_accessor
verwendet, um Getter- und Setter-Methoden für diese Variable zu erstellen, damit wir auf die Variable wie Object.variable
oder zugreifen können Object.variable = some_value
.
Ich habe gelesen, attr_accessible
dass diese spezifische Variable für die Außenwelt zugänglich ist. Kann mir bitte jemand sagen, was der Unterschied ist
ruby-on-rails
ruby
felix
quelle
quelle
attr_accessor
wird verwendet, um Getter- und Setter-Methoden zu generieren. In meiner Antwort auf eine vorherige Frage finden Sie eine ziemlich umfassende Erklärung zuattr_accessible
: stackoverflow.com/questions/2652907/…. Aktualisieren Sie dann Ihre Frage, wenn Sie danach weitere spezifische Details benötigen.Antworten:
attr_accessor
ist eine Ruby-Methode, die einen Getter und einen Setter macht.attr_accessible
ist eine Rails-Methode, mit der Sie Werte an eine Massenzuweisung übergeben können:new(attrs)
oderupdate_attributes(attrs)
.Hier ist eine Massenaufgabe:
Sie können sich vorstellen, dass die Bestellung beispielsweise auch einen Rabattcode enthält
:price_off
. Wenn Sie nicht markieren,:price_off
währendattr_accessible
Sie verhindern, dass bösartiger Code dies tun kann:Auch wenn Ihr Formular kein Feld für enthält
:price_off
, ist es in Ihrem Modell standardmäßig verfügbar. Dies bedeutet, dass ein gestalteter POST ihn immer noch einstellen kann. Durch die Verwendung vonattr_accessible
weißen Listen werden die Dinge aufgelistet, die massenweise zugewiesen werden können.quelle
attr_accessible
in der Rails-Dokumentation? api.rubyonrails.orgattr_accessible
edgeguides.rubyonrails.org/…Viele Leute in diesem Thread und bei Google erklären sehr gut, dass
attr_accessible
eine Whitelist von Attributen angegeben ist, die in großen Mengen aktualisiert werden dürfen ( alle Attribute eines Objektmodells gleichzeitig ). Dies dient hauptsächlich (und nur) dem Schutz Ihrer Anwendung aus "Massenauftrag" Piraten Exploit.Dies wird hier im offiziellen Rails-Dokument: Massenzuweisung erläutert
attr_accessor
ist ein Ruby-Code zum (schnellen) Erstellen von Setter- und Getter-Methoden in einer Klasse. Das ist alles.Als Erklärung fehlt nun, dass Sie beim Erstellen einer Verknüpfung zwischen einem (Rails-) Modell und einer Datenbanktabelle NIEMALS, NIEMALS, NIEMALS
attr_accessor
in Ihrem Modell Setter und Getter erstellen müssen, um Ihre zu ändern Tabellenaufzeichnungen.Dies liegt daran, dass Ihr Modell alle Methoden von der
ActiveRecord::Base
Klasse erbt , die bereits grundlegende CRUD-Accessoren (Erstellen, Lesen, Aktualisieren, Löschen) für Sie definiert. Dies wird im offiziellen Dokument hier Rails Model und hier Überschreiben des Standard-Accessors erläutert (scrollen Sie nach unten zum Kapitel "Standard-Accessor überschreiben").Sagen Sie zum Beispiel: Wir haben eine Datenbanktabelle namens "Benutzer", die drei Spalten "Vorname", "Nachname" und "Rolle" enthält:
SQL-Anweisungen:
Ich ging davon aus, dass Sie die Option
config.active_record.whitelist_attributes = true
in Ihrer config / environment / Production.rb festgelegt haben, um Ihre Anwendung vor dem Exploit der Massenzuweisung zu schützen. Dies wird hier erklärt: MassenzuordnungIhr Rails-Modell funktioniert perfekt mit dem folgenden Modell:
Sie müssen jedoch jedes Benutzerattribut in Ihrem Controller separat aktualisieren, damit die Ansicht Ihres Formulars funktioniert:
Um Ihnen das Leben zu erleichtern, möchten Sie keinen komplizierten Controller für Ihr Benutzermodell erstellen. Sie verwenden also die
attr_accessible
spezielle Methode in Ihrem Klassenmodell:Sie können also die "Autobahn" (Massenzuweisung) verwenden, um Folgendes zu aktualisieren:
Sie haben die "Rollen" -Attribute nicht zur
attr_accessible
Liste hinzugefügt, weil Sie nicht zulassen, dass Ihre Benutzer ihre Rolle selbst festlegen (wie z. B. admin). Sie tun dies selbst in einer anderen speziellen Administratoransicht.Obwohl in Ihrer Benutzeransicht kein "Rollen" -Feld angezeigt wird, kann ein Pirat leicht eine HTTP-POST-Anforderung senden, die "Rolle" im Parameter-Hash enthält. Das fehlende "Rollen" -Attribut auf
attr_accessible
soll Ihre Anwendung davor schützen.Sie können Ihr user.role-Attribut weiterhin wie unten beschrieben ändern, jedoch nicht mit allen Attributen zusammen.
Warum zum Teufel würdest du das benutzen
attr_accessor
?Nun, dies wäre der Fall, wenn Ihr Benutzerformular ein Feld, das in Ihrer Benutzertabelle nicht vorhanden ist, als Spalte anzeigt.
Angenommen, in Ihrer Benutzeransicht wird das Feld "Bitte sagen Sie dem Administrator, dass ich hier bin" angezeigt. Sie möchten diese Informationen nicht in Ihrer Tabelle speichern. Sie möchten nur, dass Rails Ihnen eine E-Mail sendet, in der Sie gewarnt werden, dass ein "verrückter" ;-) Benutzer sich angemeldet hat.
Um diese Informationen nutzen zu können, müssen Sie sie vorübergehend irgendwo speichern. Was ist einfacher, als es in einem
user.peekaboo
Attribut wiederherzustellen ?Also fügen Sie dieses Feld Ihrem Modell hinzu:
So können Sie das
user.peekaboo
Attribut irgendwo in Ihrem Controller gründlich nutzen , um eine E-Mail zu senden oder zu tun, was Sie wollen.ActiveRecord speichert das Attribut "peekaboo" nicht in Ihrer Tabelle, wenn Sie eine ausführen,
user.save
da in ihrem Modell keine Spalte angezeigt wird, die diesem Namen entspricht.quelle
attr_accessor
ist eine Ruby-Methode, mit der Sie Setter- und Getter-Methoden für eine gleichnamige Instanzvariable verwenden können. Es ist also gleichbedeutend mitattr_accessible
ist eine Rails-Methode, die bestimmt, welche Variablen in einer Massenzuweisung festgelegt werden können.Wenn Sie ein Formular einreichen und so etwas haben,
MyModel.new params[:my_model]
möchten Sie ein bisschen mehr Kontrolle haben, damit die Leute keine Dinge einreichen können, die Sie nicht möchten.Sie können dies tun,
attr_accessible :email
damit jemand, der sein Konto aktualisiert, seine E-Mail-Adresse ändern kann. Aber Sie würden es nicht tun,attr_accessible :email, :salary
weil dann eine Person ihr Gehalt durch eine Formularübermittlung festlegen könnte. Mit anderen Worten, sie könnten sich den Weg zu einer Gehaltserhöhung bahnen.Diese Art von Informationen muss explizit behandelt werden. Es reicht nicht aus, es nur aus dem Formular zu entfernen. Jemand könnte mit Firebug hineingehen und das Element in das Formular einfügen, um ein Gehaltsfeld einzureichen. Sie könnten die eingebaute Locke verwenden, um ein neues Gehalt an die Controller-Aktualisierungsmethode zu senden. Sie könnten ein Skript erstellen, das einen Beitrag mit diesen Informationen sendet.
Es geht also
attr_accessor
darum, Methoden zum Speichern von Variablen zu erstellen, und esattr_accessible
geht um die Sicherheit von Massenzuweisungen.quelle
attr_accesible
:as
!class User < ActiveRecord::Base
attr_accessor
ist Ruby-Code und wird verwendet, wenn Sie keine Spalte in Ihrer Datenbank haben, aber dennoch ein Feld in Ihren Formularen anzeigen möchten. Die einzige Möglichkeit, dies zuzulassen, besteht darinattr_accessor :fieldname
, dieses Feld in Ihrer Ansicht oder Ihrem Modell zu verwenden, wenn Sie dies wünschen, jedoch hauptsächlich in Ihrer Ansicht.Betrachten wir das folgende Beispiel
Hier haben wir
attr_reader
( lesbares Attribut ) undattr_writer
( beschreibbares Attribut ) für den Zugriff verwendet. Aber wir können die gleiche Funktionalität mit erreichenattr_accessor
. Kurz gesagt, attr_accessor bietet Zugriff auf Getter- und Setter-Methoden.Der geänderte Code ist also wie folgt
attr_accessible
Mit dieser Option können Sie alle Spalten auflisten, für die Sie die Massenzuweisung zulassen möchten. Das Gegenteil davon ist,attr_protected
was bedeutet, dass ich in diesem Feld NICHT möchte, dass jemand eine Massenzuweisung erhält. Höchstwahrscheinlich wird es sich um ein Feld in Ihrer Datenbank handeln, mit dem niemand herumspielen soll. Wie ein Statusfeld oder ähnliches.quelle
In zwei Worten:
attr_accessor
istgetter
,setter
Methode. Dasattr_accessible
heißt, dass ein bestimmtes Attribut zugänglich ist oder nicht. das ist es.Ich möchte hinzufügen, dass wir den Parameter Strong verwenden sollten, anstatt
attr_accessible
vor Massenzuweisung zu schützen.Prost!
quelle
Eine schnelle und übersichtliche Übersicht über die Unterschiede:
quelle