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 .

¿Fue útil?

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 " ;.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top