Rails - 格式编号作为Getter中的货币格式

时间:2012-04-07 11:13:04

标签: ruby-on-rails currency

我正在制作一个简单的零售商业解决方案,在一些不同的模型中有价格。这些价格导致总价。想象一下,为你的酸奶选择一个馅料需要花费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。一旦你这样做,你就失去了对数字进行操作的能力,因为它现在是一个字符串。

请注意是否有人遇到与我相同的问题。

4 个答案:

答案 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

到你的模特