attr_accessible
(documentation) sagt: "Die angegebenen Attribute sind zugänglich und alle anderen sind geschützt" (man denke an ihn als whitelisting.)
während
attr_protected
(documentation) sagt: „Die angegebenen Attribute sind geschützt und alle anderen sind zugänglich“(man denke an ihn als blacklisting.)
A Attribut protected ist, dass nur explizit geändert werden können (zB über Attribut =) und kann nicht über Massenzuweisung aktualisiert werden (z. Verwenden Sie model.update_attributes
oder indem Sie Attribute an new
übergeben). Das Verhalten bei einem Versuch, ein geschütztes Attribut über die Massenzuweisung zu aktualisieren, hängt von der Einstellung mass_assignment_sanitizer
ab (siehe das unten stehende Update). Das klassische Beispiel wäre, wenn ein User
Modell ein is_admin
Attribut hätte, das Sie dieses Attribut schützen könnten, um Formulareinreichungen zu verhindern, die es jedem Benutzer erlauben würden, als Administrator eingestellt zu werden.
Beispiel:
class User < ActiveRecord::Base
# explicitly protect is_admin, any new attributes added to the model
# in future will be unprotected so we need to remember to come back
# and add any other sensitive attributes here in the future
attr_protected :is_admin
end
Vergleich:
class User < ActiveRecord::Base
# explicitly unprotect name and bio, any new attributes added to the model
# in the future will need to be listed here if we want them to be accessible
attr_accessible :name, :bio
end
Wenn man nun annimmt is_admin
Attribut geschützt:
> u = User.find_by_name('mikej')
> u.is_admin?
false
> u.update_attributes(:name => 'new name', :is_admin => true)
> u.is_admin?
false
> u.name
"new name"
> u.is_admin = true # setting it explicitly
> u.save
> u.is_admin?
true
Update: Spätere Versionen von Rails stellte das Konzept einer Massenzuordnung Sanitizer, um das Verhalten bei Versuchen, geschützte Attribute über Massenzuweisung zu aktualisieren, zu steuern. In Rails 3.2 und höher kann dies durch Setzen von mass_assignment_sanitizer
in Config gesteuert werden. Standardmäßig werden nur die Versuche protokolliert, und die Codeausführung wird fortgesetzt. Die Standardumgebungskonfiguration für die Entwicklung setzt dies jedoch auf :strict
, was bei einem Versuch, ein geschütztes Attribut zu aktualisieren, als Ausnahme auftritt.
können wir sie zusammen verwenden? – Salil
ja, aber Attribute könnten anders sein – fl00r
Nein, Sie können nur das eine oder andere verwenden. Wenn Sie beide in eine Klasse einbeziehen, sehen Sie beim ersten Laden der Klasse keinen Fehler, aber sie wird sich wahrscheinlich als 'NoMethodError: Sie haben ein Nil-Objekt, wenn Sie es nicht erwartet haben! 'Manifestieren, wenn Sie versuchen zu verwenden die Klasse. – mikej