使用before_validation更改数据格式不起作用

时间:2015-07-11 22:13:38

标签: ruby-on-rails validation ruby-on-rails-4 callback

我将模型实例的一些属性保存为浮点数,但我的应用程序必须使用逗号而不是点来处理表单中的输入(例如,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

任何帮助都将不胜感激。

3 个答案:

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