Для проверки Rails требуется числовое значение, даже если для presence не установлено значение true

#ruby-on-rails #ruby #ruby-on-rails-3

#ruby-on-rails #ruby #ruby-on-rails-3

Вопрос:

Я пытаюсь сохранить запись, в которой нет одного набора полей, который имеет значение validate numericality в моделях. Несмотря на то, что присутствие при проверке не требуется, оно по-прежнему выдает ошибку, что поле не является числом.

Проверка:

 validates :network_id,    :numericality => true
  

Код для этого — сохранение модели:

 networks.each do |network|
  network.url = network.raw_data.link
  network.save!
end
  

Ошибка:

 Validation failed: Network is not a number
  

Ответ №1:

 validates :network_id, :numericality => true, :allow_nil => true
  

Комментарии:

1. @Unixmonkey будет ли это необходимо для каждого поля в БД, которое допускает нулевые значения? или есть ли способ позволить rails обрабатывать это автоматически (кажется, что это боль в заднице, чтобы установить presence или allow_nil)

2. @Hopstream Если вы проверяете числовое значение, то nil не является числовым значением. Вы должны явно разрешить это. Вам не нужно делать это для всех полей.

3. Хорошо, но что, если мне не нужны нулевые значения? Что, если y ХОЧЕТ сохранить числа?

4. @ExiRe: если вам нужны только числа, тогда validates :network_id, :numericality => true . Это вызовет ошибку проверки, если вы попытаетесь сохранить значение nil.

Ответ №2:

     validates :network_id, :numericality => {:allow_blank => true}
  

Комментарии:

1. Я думаю, что это был правильный способ написать это, тогда 1

2. Это более полезный ответ

3. Это действительно лучше, поскольку позволяет использовать пустые строки: edgeguides.rubyonrails.org /…

4. При такой проверке, если вы отправляете нечисловое значение, проверка проходит, но значение устанавливается пустым, что не то, что вы хотите

5. @ChristerFernstrom Я думаю, что ваше утверждение здесь неверно. По крайней мере, это то, что я тестировал здесь: github.com/pmatsinopoulos/test_numericality Смотрите тесты на пользовательской модели. С моей стороны они переходят на зеленый.

Ответ №3:

Вы должны использовать allow_blank

 validates :network_id,    :numericality => true, :allow_blank => true
  

Комментарии:

1. о боже, я думал, что по умолчанию разрешено значение nil. Должен ли я добавлять это ко всем полям, которым разрешено быть равными нулю? вид кажется избыточным в части rails.

2. @apneadiving Я могу ошибаться… это должно быть «проверяет: network_id, :численность => {: allow_blank => true}`, не так ли?

3. @Hopstream: посмотрите на мою ссылку: параметр:allow_blank аналогичен параметру:allow_nil

4. @Hopstream: это необходимо из-за numericality проверки

5. ссылка, которую вы разместили для документа, повреждена

Ответ №4:

В Rails 4 (Ruby 2) вы можете написать:

 validates :network_id, numericality: { greater_than_or_equal_to: 0, allow_nil: true }
  

Комментарии:

1. Я не знаю, почему это не работает для меня. Я использую Rails 4.2. С помощью этой проверки я могу сохранить значение nil, но это также позволяет сохранять строку.

Ответ №5:

Вы также можете написать так…

 validates_numericality_of :network_id, allow_nil: true