6

假设我有一个名为Product的模型,其字段名为brand。假设品牌值以this_is_a_brand格式存储。我可以在模型(或其他任何地方)中定义一个方法,允许我在调用之前修改品牌的价值。例如,如果我调用@product.brand,我想得到This is a Brand,而不是this_is_a_brand

4

4 回答 4

11

我建议使用方括号语法 ( []and []=) 而不是read_attributeand write_attribute。方括号语法更短,旨在包装受保护的read/write_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,您应该使用read_attributeand 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”变成“这是一个品牌”

于 2015-09-05T22:45:30.880 回答
0

在您的模型中,您可以覆盖方法调用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 回答