#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