比方说,我有这个型号名为产品与字段品牌。假设品牌的值以格式this_is_a_brand存储。我可以在模型(或其他地方)中定义一种方法,允许我在调用品牌之前修改其值。例如,如果我拨打@ product.brand,我想获得这是品牌,而不是this_is_a_brand。Ruby on Rails - 我可以在调用属性值之前修改它的值吗?
5
A
回答
9
我会建议使用,而不是read_attribute
和write_attribute
方括号语法([]
和[]=
)。方括号语法较短,并且designed to wrap the protected read/write_attribute methods。
def brand
original = self[:brand]
transform(original)
end
def brand=(b)
self[:brand] = reverse_transform(b)
end
0
在您的模型中,您可以覆盖方法调用brand
。
def brand
#code to modify the value that is stored in brand
return modified_brand
end
这将允许它被存储为this_is_a_brand。但是,它会被归为“这是一个品牌”。
7
不是直接访问@属性相反,你应该使用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
1
我试过了,但我怎么引用“内部”的品牌? – sker 2008-10-08 07:26:37
好的,我明白了。属性存储在@attributes中,所以我可以在方法中调用@attributes ['brand']。谢谢你的帮助。 – sker 2008-10-08 07:51:06