2010-03-19 2 views
4

Я пытался написать валидацию для Rails, чтобы цена, введенная в форму, была больше нуля. Это работает ... вроде как. Проблема в том, что когда я запускаю его, val превращается в целое число, поэтому он считает, что .99 меньше .1. Что происходит, и как мне исправить код?Написание проверки валидатора с целым числом

class Product < ActiveRecord::Base 
    protected 
    def self.validates_greater_than_zero(*attr_names) 
     validates_each(attr_names) do |record, attr, val| 
     record.errors.add(attr, "should be at least 0.01 (current val = #{val.to_f})") if val.nil? || val < 0.01 
     end 
    end 
    public 
    validates_presence_of :title, :description, :image_url 
    validates_numericality_of :price 
    validates_greater_than_zero :price 
end 

ответ

1

Если исходное строковое значение отлито для целого числа, оно будет округлено вниз. Таким образом, «0.99» округляется до 0, что, очевидно, меньше 0,01. Вы должны сравнить с исходной строкой, которую вы можете получить из метода <attr>_before_type_cast.

Что-то, как это должно работать:

validates_each(attr_names) do |record, attr, val| 
    if record.send("#{attr}_before_type_cast").to_f < 0.01 
    record.errors.add(attr, "error message here") 
    end 
end 
1

Вы можете изменить

validates_numericality_of :price 

в

validates_numericality_of :price, :greater_than_or_equal_to => 0.01 

, кажется, сделать то, что ваш validates_greater_than_zero валидатор хочет сделать.

+0

Большое спасибо, что поможет мне написать лучший код в будущем. – 2010-03-20 13:01:48

Смежные вопросы