2012-04-07 81 views
5

我正在製作一個簡單的零售商務解決方案,其中有價格在幾個不同的模型中。這些價格有助於總價格。想象一下,爲您的酸奶選擇一個頂部,多付0.30美元。Rails - 在Getter中格式化爲貨幣格式的數字

當我price字段設置爲

t.decimal :price, precision:8, scale:2 

數據庫存儲6.506.5。我知道在標準的rails方式中,您可以撥打number_to_currency(price)來獲取Views中的格式化值。我需要以編程方式調用price字段以及格式化的字符串,即$ 6.50幾個不直接屬於視圖的位置。另外,我的需求很簡單(沒有貨幣換算等),我更喜歡在模型中普遍地格式化價格,而不必在視圖中重複調用number_to_currency。

有沒有一種很好的方法可以修改我的吸氣劑的價格,使其始終以美元符號返回兩位小數,即$ 6.50時它被稱爲?

在此先感謝。

UPDATE

謝謝大家。

我選擇使用亞歷克斯的方法,因爲它似乎非常'hackish'做包括只是爲了格式化數字。用他的方法,我做了:

def price_change=(val) 
     write_attribute :price_change, val.to_s.gsub(/[\$]/,'').to_d 
    end 

    def price_change 
    "$%.2f" % self[:price_change] 
    end 

乾杯。

UPDATE 2

買者自負。一旦你這樣做,你就失去了對數字進行操作的能力,因爲它現在是一個字符串。

請小心是否有人面臨與我一樣的問題。

回答

12

只需添加在您的模型的方法被命名爲類似於像數據庫中的屬性:

def price 
    "$%.2f" % self[:price] 
end 

,讓你完全控制格式化或使用Rails提供的輔助方法

def price 
    ActionController::Base.helpers.number_to_currency(self[:price]) 
end 

這應該可以做到。 希望它有幫助!

+1

謝謝!認爲必須內置一些數字格式。有一點擔心將ActionView或ActionController包含到模型中。 – 2012-04-08 06:58:37

+0

這個問題是你不能使用價格作爲數字,它是一個字符串無處不在。我正在尋找一種方法,使鐵扶手這種方式轉換它to_s – Joelio 2014-03-20 21:53:22

-1

嘗試

include ActionView::Helpers::NumberHelper 

到模型

1

我會建議去用一個Presenter的方法,就像Draper(見this reailscast)一樣。

另一種解決方案是在您的模型中實現您自己的方法,即formatted_price並自行完成格式設置(即使用ActionView::Helpers::NumberHelper模塊)。但是,因爲模型代表了你的rails應用程序中的明文數據,所以這樣做有點陰暗,我認爲它干擾了慣例和配置方法。

2

你可以使用助手模塊,但是你不應該包含整個模塊,因爲它包含了很多你可能不需要的方法,或者覆蓋了你的一些方法。但你可以直接使用它們:

ActionController::Base.helpers.number_to_currency(6.5) 
#=> "$6.50" 

你也可以爲幫助者定義一個方法,這樣你可以很容易地使用它們。

def helpers 
    ActionController::Base.helpers 
end 

"#{helpers.number_to_currency(6.5)}" 

看一看這個railscast

+0

謝謝你。像上面這樣,有點謹慎,似乎打破了MVC。我會實際嘗試兩個=) – 2012-04-08 07:01:08