我有一个问题是在运行验证之前从货币中剥离美元符号和逗号。出于某种原因,保存后该值设置为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
答案 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