2012-04-07 87 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