2008-09-26 11 views
12

Mon modèle de facture a un attribut address_id, et je ne veux pas que cet address_id change FOREVER. Donc, je ne veux pas que cela se produise en dehors de la classe:Comment protéger un attribut de modèle Rails?

invoice.address_id = 1 
invoice.address = some_address 

Rails ajoute automatiquement cet attribut ADDRESS_ID au modèle de la table de la facture, alors comment puis-je déclarer cet attribut privé/protégé? L'appel

attr_protected :address_id 

est probablement pas la solution car basé sur la documentation il empêche seulement les affectations de masse.

Merci!

Répondre

19

Vous voulez attr_readonly.

+0

Cela ne va-t-il pas empêcher Rails de mettre à jour et de sauvegarder le modèle dans la base de données? – Gishu

+0

nice - ne connaissait pas la méthode existait;) @Gishu non je ne pense pas que cela bloquerait le modèle d'épargne - il serait simplement ignorer les changements dans les champs énumérés dans * attributs – ryw

+0

Est-ce que cette méthode n'est disponible que dans Rails 2. * ? Je cours dans Rails 1.2.6. – gsmendoza

3

Pas aussi jolie comme une doublure, mais le code ci-dessous devrait fonctionner (et vous pouvez toujours faire un peu metaprogramming d'écrire une méthode « immuable »)

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