2008-10-08 11 views
5

Digamos que tengo este modelo llamado Producto con un campo llamado marca. Suponga que los valores de marca se almacenan en el formato this_is_a_brand. ¿Puedo definir un método en el modelo (o en cualquier otro lugar) que me permita modificar el valor de la marca antes de que se llame? Por ejemplo, si llamo a @ product.brand, quiero obtener Esta es una marca, en lugar de this_is_a_brand.Ruby on Rails: ¿Puedo modificar el valor de un atributo antes de invocarlo?

Respuesta

9

Yo recomiendo usar la sintaxis de corchetes ([] y []=) en lugar de read_attribute y write_attribute. La sintaxis del corchete es más corta y designed to wrap the protected read/write_attribute methods.

def brand 
    original = self[:brand] 
    transform(original) 
end 

def brand=(b) 
    self[:brand] = reverse_transform(b) 
end 
0

En su modelo puede anular la llamada al método brand.

def brand 
#code to modify the value that is stored in brand 
return modified_brand 
end 

Esto permitirá que se puede almacenar como this_is_a_brand. Sin embargo, será devuelto como "esta es una marca".

+0

lo he intentado, pero ¿cómo puedo hacer referencia a la marca "interno"? – sker

+0

Ok, lo tengo. Los atributos se almacenan en @attributes para que pueda simplemente llamar a @attributes ['brand'] dentro del método. Gracias por tu ayuda. – sker

7

en lugar de acceder directamente @attributes, se debe utilizar read_attribute y write_attribute:

def brand 
    b = read_attribute(:brand) 
    b && b.transform_in_some_way 
end 

def brand=(b) 
    b && b.transform_in_some_way 
    write_attribute(:brand, b) 
end 
+0

¿Qué significa el modismo b && b.transform_in_some_way? – sker

+0

¿Y por qué es mejor usar esos métodos? – sker

+0

Espera, lo entiendo. Gracias por tu ayuda. – sker

1

Como la última respuesta fue publicada hace 7 años, voy a aportar lo sugiere el Rails API actualmente.

def brand 
    super.humanize 
end 

Humanize vueltas 'this_is_a_brand' a 'Esta es una marca'