我正在制作一个简单的零售商业解决方案,在一些不同的模型中有价格。这些价格导致总价。想象一下,为你的酸奶选择一个馅料需要花费0.30美元。
当我将price
字段设置为
t.decimal :price, precision:8, scale:2
数据库将6.50
存储为6.5
。我知道在标准rails方式中,您调用number_to_currency(price)
来获取Views中的格式化值。我需要以编程方式调用price
字段以及格式化的字符串,即6.50美元的几个不直接属于View的地方。此外,我的需求很简单(没有货币转换等),我更喜欢在模型中普遍定价格式,而不会在视图中重复调用number_to_currency。
有没有一种好方法可以修改我的吸气剂的价格,以便它总是返回带有美元符号的两位小数,即调用时为6.50美元?
提前致谢。
更新
谢谢大家。
我选择使用亚历克斯的方法,因为看起来非常“hackish”只是为了格式化数字。用他的方法,我做了:
def price_change=(val)
write_attribute :price_change, val.to_s.gsub(/[\$]/,'').to_d
end
def price_change
"$%.2f" % self[:price_change]
end
干杯。
更新2
警告Emptor。一旦你这样做,你就失去了对数字进行操作的能力,因为它现在是一个字符串。
请注意是否有人遇到与我相同的问题。
答案 0 :(得分:13)
只需在模型中添加一个名为数据库中属性的方法,如:
def price
"$%.2f" % self[:price]
end
可让您完全控制格式或使用Rails提供的帮助方法
def price
ActionController::Base.helpers.number_to_currency(self[:price])
end
这应该可以解决问题。 希望它有所帮助!
答案 1 :(得分:2)
您可以使用帮助程序模块,但不应包含整个模块,因为它包含许多您可能不需要的方法或覆盖您的某些方法。但你可以直接使用它们:
ActionController::Base.helpers.number_to_currency(6.5)
#=> "$6.50"
您还可以为帮助程序定义方法,以便您可以轻松使用它们。
def helpers
ActionController::Base.helpers
end
"#{helpers.number_to_currency(6.5)}"
看看这个railscast
答案 2 :(得分:1)
我建议使用Presenter方法,比如Draper(请参阅this reailscast)。
另一个解决方案是在您的模型中实现您自己的方法,即formatted_price
并自行进行格式化(即使用ActionView::Helpers::NumberHelper
模块)。但是,由于模型代表了rails应用程序中的普通数据,所以它做了类似这样的事情并且它干扰了约定优于配置方法,我认为。
答案 3 :(得分:-1)
尝试
include ActionView::Helpers::NumberHelper
到你的模特