2008-10-08 82 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」到「這是一個品牌的

相關問題