Написание валидатора рельсов с целым числом - PullRequest
4 голосов
/ 19 марта 2010

Я пытался написать валидацию для 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

Ответы [ 2 ]

1 голос
/ 19 марта 2010

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

validates_numericality_of :price

до

validates_numericality_of :price, :greater_than_or_equal_to => 0.01

похоже, что то, что хочет сделать ваш validates_greater_than_zero.

1 голос
/ 19 марта 2010

Если исходное значение строки приведено к целому числу, оно будет округлено в меньшую сторону. Таким образом, «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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...