2008-10-08 56 views
5

比方说,我有这个型号名为产品与字段品牌。假设品牌的值以格式this_is_a_brand存储。我可以在模型(或其他地方)中定义一种方法,允许我在调用品牌之前修改其值。例如,如果我拨打@ product.brand,我想获得这是品牌,而不是this_is_a_brandRuby on Rails - 我可以在调用属性值之前修改它的值吗?

回答

9

我会建议使用,而不是read_attributewrite_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。但是,它会被归为“这是一个品牌”。

+0

我试过了,但我怎么引用“内部”的品牌? – sker 2008-10-08 07:26:37

+0

好的,我明白了。属性存储在@attributes中,所以我可以在方法中调用@attributes ['brand']。谢谢你的帮助。 – sker 2008-10-08 07:51:06

7

不是直接访问@属性相反,你应该使用read_attributewrite_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

当最后答案7年前发布的,我会贡献什么Rails API目前建议。

def brand 
    super.humanize 
end 

Humanize圈“this_is_a_brand”到“这是一个品牌的