Ruby on Rails - Posso modificar o valor de um atributo antes que ele seja chamado?
-
05-07-2019 - |
Pergunta
Digamos que eu tenho esse modelo chamado produtos com um campo nomeado marca. Suponha que os valores de marca são armazenados no formato this_is_a_brand. Posso definir um método no modelo (ou em qualquer outro lugar) que me permita modificar o valor de marca antes que seja chamado. Por exemplo, se eu ligar @product.brand, Eu quero conseguir Esta é uma marca, ao invés de this_is_a_brand.
Solução
Eu recomendaria usar a sintaxe do suporte quadrado ([]
e []=
) ao invés de read_attribute
e write_attribute
. A sintaxe do suporte quadrado é mais curto e projetado para embrulhar o protegido LEIT/WRITLE_ATTRIBUE Métodos.
def brand
original = self[:brand]
transform(original)
end
def brand=(b)
self[:brand] = reverse_transform(b)
end
Outras dicas
Em vez de acessar @attributes diretamente, você deve usar read_attribute
e 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 a última resposta foi publicada há 7 anos, contribuirei com o que o API do Rails atualmente sugere.
def brand
super.humanize
end
Humanizar transforma 'this_is_a_brand' para 'esta é uma marca'
No seu modelo, você pode substituir a chamada do método brand
.
def brand
#code to modify the value that is stored in brand
return modified_brand
end
Isso permitirá que ele seja armazenado como this_is_a_brand. Mas, será devolvido como "esta é uma marca".