ruby-on-rails - generate - ruby and rails documentation
Ruby on Rails-¿Puedo modificar el valor de un atributo antes de que se llame? (4)
Digamos que tengo este modelo llamado Producto con un campo llamado marca . Supongamos que los valores de la 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 This is a Brand , en lugar de this_is_a_brand .
En lugar de acceder a @attributes directamente, debe usar 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
En su modelo puede anular la brand
llamada de método.
def brand
#code to modify the value that is stored in brand
return modified_brand
end
Esto permitirá que se almacene como this_is_a_brand. Sin embargo, será devuelto como "esta es una marca".
Yo recomendaría utilizar la sintaxis del corchete cuadrado ( []
y []=
) en lugar de read_attribute
y write_attribute
. La sintaxis de corchetes es más corta y está diseñada para envolver los métodos protegidos de lectura / escritura_tributo .
def brand
original = self[:brand]
transform(original)
end
def brand=(b)
self[:brand] = reverse_transform(b)
end
Como la última respuesta se publicó hace 7 años, contribuiré con lo que la API de Rails sugiere actualmente.
def brand
super.humanize
end
Humanize convierte ''this_is_a_brand'' en ''This is a brand''