在before_validation回调中从字符串转换货币的问题

时间:2014-05-16 19:18:58

标签: ruby-on-rails ruby activerecord ruby-on-rails-4

我有一个问题是在运行验证之前从货币中剥离美元符号和逗号。出于某种原因,保存后该值设置为0

class Property < ActiveRecord::Base
  before_validation :format_currency

  validates :street_name_1, presence: true
  validates :city, presence: true
  validates :state, presence: true
  validates :postal_code, presence: true
  validates :rate, presence: true, numericality: true

  private
  def format_currency
    self.rate = rate.to_s.gsub(/[^0-9\.]/, '').to_i # Strip out non-numeric characters
  end

end

当我在rails控制台中执行'$3,500'.to_s.gsub(/[^0-9\.]/, '').to_i时,它会正确返回“3500”。 rate也正在从表单中正确传递给模型。

对于我的生活,我无法弄清楚为什么它没有正确设置保存值。任何帮助将不胜感激。

编辑:由于数据库列是整数,我需要覆盖默认的setter并在设置速率时执行我的gsub。

def rate=(rate)
    write_attribute(:rate, rate.to_s.gsub(/[^0-9\.]/, '').to_i)
end

1 个答案:

答案 0 :(得分:0)

由于您将rate列存储为整数,并且您正在使用Rails,因此我建议您完全删除format_currency方法。 Rails有一种处理货币的方法:number_to_currency

当您想要输出价格时,只需使用帮助器:

number_to_currency @property.rate

这也为您提供了更大的灵活性,因为您可以对其进行本地化并将其传递给其他许多选项。 Have a look at the API

编辑,根据OP编辑问题:

如果您想以该格式保存某些内容,为什么不在模型中应用美元正弦?

before_save :set_rate
def set_rate
  self.rate = "$#{rate}"
end