5

我正在制作一个简单的零售商务解决方案,其中有几种不同型号的价格。这些价格构成了总价格。想象一下为您的酸奶选择浇头多付 0.30 美元。

当我将price字段设置为

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

数据库存储6.506.5. 我知道在标准 rails 方式中,您调用number_to_currency(price)以获取视图中的格式化值。我需要以编程方式调用该price字段以及格式化字符串,即 $6.50 一些不直接属于视图的地方。此外,我的需求很简单(没有货币转换等),我更喜欢在模型中对价格进行通用格式化,而无需在视图中重复调用 number_to_currency。

有没有一种好方法可以修改我的 getter 价格,使其始终返回带美元符号的小数点后两位,即调用时 6.50 美元?

提前致谢。

更新

谢谢大家。

我选择使用 Alex 的方法,因为仅仅为了格式化数字而进行包含似乎非常“骇人听闻”。使用他的方法,我做了:

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

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

干杯。

更新 2

买者自负。一旦你这样做了,你就失去了对数字进行操作的能力,因为它现在是一个字符串。

请注意是否有人面临与我相同的问题。

4

4 回答 4

14

只需在模型中添加一个方法,该方法的名称类似于数据库中的属性,例如:

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

这使您可以完全控制格式或使用 Rails 提供的辅助方法

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

这应该可以解决问题。希望能帮助到你!

于 2012-04-07T11:28:01.823 回答
2

您可以使用 helpers 模块,但不应包含整个模块,因为它包含许多您可能并不真正需要或覆盖您的某些方法的方法。但是你可以直接使用它们:

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

您还可以为帮助程序定义一个方法,以便您可以轻松地使用它们。

def helpers
  ActionController::Base.helpers
end

"#{helpers.number_to_currency(6.5)}"

看看这个railscast

于 2012-04-07T11:37:51.953 回答
1

我建议使用 Presenter 方法,例如 Draper(请参阅realilscast)。

另一种解决方案是在您的模型中实现您自己的方法,即formatted_price自己进行格式化(即使用ActionView::Helpers::NumberHelper模块)。但是由于模型代表了您的 Rails 应用程序中的纯数据,所以我认为这样做有点阴暗,并且它会干扰约定优于配置的方法。

于 2012-04-07T11:28:51.810 回答
-1

尝试

include ActionView::Helpers::NumberHelper

到你的模型

于 2012-04-07T11:25:44.317 回答