Ruby on Rails-呼び出される前に属性の値を変更できますか?
-
05-07-2019 - |
質問
brand という名前のフィールドを持つ Product という名前のこのモデルがあるとします。 brand の値が this_is_a_brand の形式で保存されているとします。モデル(または他の場所)で、 brand の値を呼び出す前に変更できるメソッドを定義できますか。たとえば、 @ product.brand に電話した場合、 this_is_a_brand ではなく、これはブランドですを取得します。
解決
read_attribute
および write_attribute ではなく、角括弧構文(
[]
および [] =
)を使用することをお勧めしますコード>。角括弧の構文は短くなり、 保護をラップするように設計されていますread / write_attributeメソッド。
def brand
original = self[:brand]
transform(original)
end
def brand=(b)
self[:brand] = reverse_transform(b)
end
他のヒント
@attributesに直接アクセスするのではなく、 read_attribute
および 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
最後の回答が7年前に投稿されたので、 Rails APIに貢献します。 は現在提案しています。
def brand
super.humanize
end
ヒューマナイズは、「this_is_a_brand」を「This」に変更しますブランドです
モデルでは、メソッド呼び出し brand
をオーバーライドできます。
def brand
#code to modify the value that is stored in brand
return modified_brand
end
これにより、this_is_a_brandとして保存できます。ただし、「これはブランドです」として返されます。
所属していません StackOverflow