2008-09-26 10 views
12

Mein Rechnungsmodell hat ein Attribut address_id, und ich möchte nicht, dass address_id FOREVER ändert. So will ich nicht, diese außerhalb der Klasse geschehen:Wie schützt man ein Rails-Modellattribut?

invoice.address_id = 1 
invoice.address = some_address 

Rails fügt automatisch dieses address_id Attribut auf das Modell aus der Rechnungstabelle, so wie kann ich erklären, dieses Attribut privat/geschützt?

attr_protected :address_id 

Aufruf ist höchstwahrscheinlich nicht die Lösung, da auf der Grundlage der Dokumentation nur Massenzuweisungen verhindert.

Danke!

Antwort

19

Sie attr_readonly wollen.

+0

Würde dies nicht davon abhalten, dass Rails das Modell in der DB aktualisiert und speichert? – Gishu

+0

schön - wusste nicht, die Methode existiert;) @Gishu nein, ich glaube nicht, es würde speichern Modell blockieren - es würde ignorieren nur Änderungen an den Feldern in * Attribute – ryw

+0

Ist diese Methode nur in Rails 2 * ? Ich laufe in Rails 1.2.6. – gsmendoza

3

Nicht so schön wie ein Einzeiler, aber Code soll unten arbeiten (und man kann immer etwas metaprogramming tut eine ‚unveränderlich‘ Methode zu schreiben)

def address_id=(id) 
    if new_record? 
    write_attribute(:address_id, id) 
    else 
    raise 'address is immutable!' 
    end 
end