2008-09-26 18 views
12

Mi modelo de factura tiene un atributo address_id, y no quiero que esta address_id cambie PARA SIEMPRE. Así que no quiero que esto suceda fuera de la clase:Cómo proteger un atributo de modelo Rails?

invoice.address_id = 1 
invoice.address = some_address 

rieles agrega automáticamente este atributo address_id al modelo de la mesa de la factura, así que ¿cómo puedo declarar este atributo privado/protegido? Llamar a

attr_protected :address_id 

es muy probable que no sea la solución ya que en base a la documentación solo se previene la asignación masiva.

Gracias!

Respuesta

19

¿Quieres attr_readonly.

+0

¿No impediría esto que Rails actualize y guarde el modelo de nuevo en la base de datos? – Gishu

+0

nice - no sabía que el método existía;) @Gishu no, no creo que bloquearía el modelo de guardado; simplemente ignoraría los cambios a los campos enumerados en * attributes – ryw

+0

. Este método solo está disponible en Rails 2. * ? Me estoy ejecutando en Rails 1.2.6. – gsmendoza

3

No es tan bonita como un chiste, pero el código de abajo debería funcionar (y siempre se puede hacer algo de metaprogramming escribir un método 'inmutable')

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