Ruby on Rails - ¿Puedo modificar el valor de un atributo antes de llamarlo?
-
05-07-2019 - |
Pregunta
Digamos que tengo este modelo denominado Producto con un campo llamado marca . Supongamos 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 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 .
Solución
Recomendaría utilizar la sintaxis de corchete ( []
y [] =
) en lugar de read_attribute
y write_attribute . La sintaxis del corchete es más corta y diseñado para envolver el protegido métodos de read / write_attribute .
def brand
original = self[:brand]
transform(original)
end
def brand=(b)
self[:brand] = reverse_transform(b)
end
Otros consejos
En lugar de acceder directamente a @attributes, 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
Como la última respuesta se publicó hace 7 años, contribuiré con lo que API de Rails sugiere actualmente.
def brand
super.humanize
end
Humanize convierte 'this_is_a_brand' en 'This es una marca '
En su modelo, puede anular el método llamado marca
.
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, se devolverá como " esta es una marca " ;.