我将模型实例的一些属性保存为浮点数,但我的应用程序必须使用逗号而不是点来处理表单中的输入(例如,10,99应保存为10.99)。 我试图用before_validation回调来做到这一点,但是我不能让它正常工作 - 使用逗号输入无法通过验证,我不断得到price / size2不是数字错误。
class Advert < ActiveRecord::Base
before_validation do
normalize(self.price) if is_number?(self.price)
normalize(self.size2) if is_number?(self.size2)
end
validates :price, presence: true, numericality: true
validates :size2, numericality: true
def is_number?(string)
true if Float(string) rescue false
end
def normalize(number)
number.to_s.gsub!(',', '.').to_f
end
任何帮助都将不胜感激。
答案 0 :(得分:0)
我没有对它进行测试,但我认为你实际上并没有修改价格和 size2 ,因为你是gsub!数字而不是将值返回到2个属性。< / p>
这样的事情:
class Advert < ActiveRecord::Base
before_validation :string_to_float
validates :price, presence: true, numericality: true
validates :size2, numericality: true
def is_number?(string)
true if Float(string) rescue false
end
def normalize(number)
number.to_s.gsub(',', '.').to_f
end
def string_to_float
self.price = normalize(self.price) if is_number?(self.price)
self.size2 = normalize(self.size2) if is_number?(self.size2)
end
end
答案 1 :(得分:0)
改为使用自定义setter方法:
class Advert
def price=(val)
@price = val.is_a?(Float) ? val : val.to_f
end
end
答案 2 :(得分:0)
由于我无法通过rails回调处理小数分隔符更改,我只是写了一个简单的jQuery解决方法,也许它会帮助某人:
normalize_input = ->
$('form').submit ->
normalized_price = $('#advert_price').val().replace(',', '.') # advert_price is a form input
normalized_size2 = $('#size2input').val().replace(',', '.') # just like the size2input
$('#advert_price').val(normalized_price)
$('#size2input').val(normalized_size2)