#ruby-on-rails #validation #activerecord
#ruby-on-rails #проверка #activerecord
Вопрос:
У меня есть таблица со столбцом (dose), который определен как десятичный. Когда пользователь заполняет поле формы для этого столбца, я хочу убедиться, что он вводит действительное число. Я хочу использовать validates_numericality_of :dose
, но это не работает. Если пользователь вводит нечисловое значение (например, ‘horse’), значение 0 сохраняется в базе данных и проверка передается. Я бы предпочел, чтобы возникла ошибка.
Есть ли способ перехватить это раньше в жизненном цикле объекта? В какой момент active record преобразует строку в 0?
Ответ №1:
Я ожидал бы, что у вас есть другой плагин или хук или что-то еще, что мешает и изменяет значение перед проверкой.
Чтобы, возможно, получить некоторое представление о том, какова ситуация, добавьте в модель хук before_validation и вызовите self.inspect, чтобы увидеть, как выглядит объект непосредственно перед запуском проверки. Попробуйте сохранить экземпляр с текстом в атрибуте:dose и посмотрите, как это выглядит.
Комментарии:
1. Ладно, странно. Я исследовал это и выполнил before_validation / self.inspect, как было предложено. Вывод показал, что текст в атрибуте:dose действительно преобразуется в 0 (на самом деле 0.0 — это то, что должно было быть в моем вопросе). Это то, что вы получаете от BigDecimal.new («лошадь»), так что на самом деле это не удивительно. Странно то, что проверка в данный момент работает. Я не знаю, почему это работает сейчас, а не раньше.
2. Ошибка Шредингера — как только вы смотрите на нее, она перестает существовать. 😉