2009-11-24 18 views
10

Wenn ich die attr_accessible verwenden, um festzulegen, welche von meinem Modell Feld aussetzen ich, ist es auch für script/console wahr? Ich meine etwas, das ich nicht angegeben habe, da attr_accessible nicht auch durch die Konsole zugänglich sein wird?attr_accessible in Schienen Active Record

Antwort

19

Dies gilt nur für die Massenzuweisung. Zum Beispiel, wenn Sie sind attr_protected :protected in Ihrem Modell setzen:

>> Person.new(:protected => "test") 
=> #<Person protected: nil> 

Umgekehrt könnten Sie setzen alle Attribute, die Sie als zugänglich wollen attr_accessible verwenden.

Allerdings wird die folgende noch arbeiten:

>> person = Person.new 
=> #<Person protected: nil> 
>> person.protected = "test" 
=> #<Person protected: "test"> 

Dies ist das gleiche Verhalten wie in Controller, Ansichten etc. attr_protectedschützt nur gegen Massenzuordnung von Variablen, in erster Linie von Formen usw.

7

fand ich, warum:

eine weiße Liste der Modell Attribute an, die über Massenbelegung, wie new(attributes), update_attributes(attributes) oder attributes=(attributes) eingestellt werden kann. Diese ist das Gegenteil von dem attr_protected Makro:

Mass-assignment will only set attributes in this list, to assign to the rest of 
attributes you can use direct writer methods. This is meant to protect sensitive 
attributes from being overwritten by malicious users tampering with URLs or forms. 
If you‘d rather start from an all-open default and restrict attributes as needed, 
have a look at `attr_protected`. 

So bedeutet es, dass es nur die Massenbelegung vermeiden, aber ich kann so eingestellt noch einen Wert.

7

Die Konsole verhält sich genau wie Ihre Rails-Anwendung. Wenn Sie einige Attribute für ein bestimmtes Modell geschützt haben, können Sie diese Attribute weder über die Konsole noch über die Rails-App selbst zuweisen.

1

Wenn Sie etwas als attr_accessible angeben, können nur diese Dinge in der Konsole oder über die Website-Schnittstelle zugegriffen werden.

zB: Angenommen, Sie name und email gemacht werden attr_accessible: created_at

attr_accessible :name, :email 

und links und updated_at (die Sie sollen). Dann können Sie nur diese Felder in der Konsole bearbeiten/aktualisieren.

0

Wenn Sie ein Feld bilden Ihr Modell verfügbar machen möchten, können Sie

attr_accessor :meth # for getter and setters 
attr_writer :meth # for setters 
attr_reader :meth # for getters 

oder wenn Sie ein bestimmtes Verhalten zu Ihrem Attribut möchten hinzufügen können, werden Sie virtuelle Attribute

def meth=(args) 
... 
end 
def meth 
... 
end 

verwenden müssen Prost.