Проверка завершается неудачно при использовании validates_presence_of и validates_numericity_of - PullRequest
1 голос
/ 09 ноября 2011

Мне нужно проверить данные в моей модели, а затем протестировать эту модель, используя rspec:

Вот проверка в модели:

validates_presence_of :sales_price
validates_presence_of :retail_price

validates_numericality_of :sales_price, :greater_than => 0
validates_numericality_of :retail_price,:greater_than => 0
validates_numericality_of :sales_price, :less_than => :retail_price,
                                          :message => "must be less than retail price."

, когда я пытаюсь проверить эту моделькак это

it { should validate_presence_of :sales_price }
it { should validate_presence_of :retail_price }
it { should validate_numericality_of :sales_price }
it { should validate_numericality_of :retail_price }

Я получаю эту ошибку

Failure/Error: it { should validate_presence_of :retail_price }
 ArgumentError:
   comparison of Float with nil failed
 # ./spec/models/offer_option_spec.rb:19:in `block (2 levels) in <top (required)>'

Как я могу решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 10 ноября 2011

Спасибо за ваш ответ.

Я наконец получил это.

validates_numericality_of :sales_price, :greater_than => 0,
                        :allow_blank => true
validates_numericality_of :retail_price, :greater_than => 0,
                        :allow_blank => true
validates_numericality_of :sales_price, :less_than => :retail_price,
                        :if => Proc.new { |o| !o.retail_price.nil? } ,
                        :message => "can't be greater than retail price."

Теперь у меня есть другая проблема.Я использую rails.validation.js, который помогает мне выполнять проверки на стороне клиента.Все нормально, если вы используете что-то подобное в числовом валидаторе:

:greater_than => 0

validation.js создает функцию, которая проверяет, больше ли значение в поле, чем 0. Функция создается так:

new Function("return " + element.val() + CHECKS[check] + options[check])()))

элемент - это мое поле ввода, CHECKS содержит другой хеш: less_than: <, большее_than:> и т. Д. Options [check] содержит некоторое значение, которое передается в валидатор (: more_than => 0, ноль в этомcase, options [check] is less_than: '0').Но когда я использую что-то другое вместо значения, я получаю сообщение об ошибке:

Uncaught ReferenceError: retail_price is not defined 

Я пробовал что-то подобное

validates_numericality_of :sales_price, :less_than => Proc.new{ self.retail_price },
                        :if => Proc.new { |o| !o.retail_price.nil? } ,
                        :message => "can't be greater than retail price."

, но объект не существует, когда выполняется проверка, поэтому self просто указывает на класс, а retail_price не существует.

что бы вы порекомендовали для решения проблемы?

3 голосов
/ 09 ноября 2011

@ sled правильно, что проверка на ноль встроена в validates_numericity_of и включена по умолчанию, поэтому нет необходимости иметь оба требования.

Еще одна вещь, которую стоит отметить, это то, что цена продажи действительно проверяет численность вдвое, чтоможет быть причиной проблемы.Вместо этого я бы изменил его на

validates_numericality_of :sales_price, :greater_than => 0, :less_than => :retail_price, :message => "must be less than retail price."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...