2010-04-16 7 views

Antwort

97

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.

+1

können wir sie zusammen verwenden? – Salil

+0

ja, aber Attribute könnten anders sein – fl00r

+4

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

7

attr_accessible ist eine weiße Liste für die Massenbelegung ...

class Foo < ActiveRecord::Base #has attributes foo and bar 
    attr_accessible :foo 
end 
f = Foo.new :foo => "test", :bar => "test" 
f.foo #=> "test" 
f.bar #=> nil 

attr_proteceted eine schwarze Liste für Massenzuordnung ist ...

class Foo < ActiveRecord::Base #has attributes foo and bar 
    attr_protected :bar 
end 
f = Foo.new :foo => "test", :bar => "test" 
f.foo #=> "test" 
f.bar #=> nil 
Verwandte Themen