6

brandという名前のフィールドを持つProductという名前のこのモデルがあるとします。brandの値がthis_is_a_brandの形式で格納されているとします。ブランドが呼び出される前にブランドの値を変更できるようにするメソッドをモデル (または他の場所) で定義できますか? たとえば、@product.brandを呼び出した場合、 this_is_a_brandではなく、This is a Brandを取得したいとします。

4

4 に答える 4

11

andの代わりに角括弧構文 ( []and ) を使用することをお勧めします。角かっこの構文は短く、保護されたread/write_attribute メソッドをラップするように設計されています。[]=read_attributewrite_attribute

def brand
  original = self[:brand]
  transform(original)
end

def brand=(b)
  self[:brand] = reverse_transform(b)
end
于 2008-10-08T17:49:38.510 に答える
8

@attributes に直接アクセスするのではなく、 and を使用する必要が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
于 2008-10-08T08:32:34.843 に答える
1

最後の回答は 7 年前に投稿されたので、Rails APIが現在提案しているものを提供します。

def brand
  super.humanize
end

Humanizeは 'this_is_a_brand' を 'This is a brand' に変換します

于 2015-09-05T22:45:30.880 に答える
0

モデルでは、メソッド call をオーバーライドできますbrand

def brand
#code to modify the value that is stored in brand
return modified_brand
end

これにより、this_is_a_brand として保存できるようになります。ただし、「これはブランドです」と返されます。

于 2008-10-08T07:25:22.450 に答える