Мое приложение имеет пользовательский ввод два раза, и я вычисляю количество времени между ними как удобство для пользователя. Таким образом, пользователь вводит 1:00 AM в качестве времени начала и 2:00 AM в качестве времени остановки, он выдаст «1 час». У меня есть вспомогательный метод, который делает это, используя драгоценный камень для тяжелого подъема. Время хранится как тип данных времени в базе данных, чтобы это работало.Время проверки в рельсах
Это все работает нормально, и теперь я хочу подтвердить, что время входа пользователя действительно, но также НЕ требуется. Поэтому, если пользователь не вводит ничего для тех времен, запись по-прежнему сохраняется, но если пользователь входит, скажем, «asdfasdf», я хочу, чтобы проверки активировались и говорили, что это недействительное время, а не просто молча не хранить время ,
Я создал свои собственные пользовательские проверки времени, как так:
class TimeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
Time.parse(value.to_s)
rescue ArgumentError
record.errors[attribute] << (options[:message] || "is not a valid time")
end
end
Тогда в моей модели, я делаю:
validates :start_time, time: true
validates :stop_time, time: true
Это то, что я хочу, насколько убедившись, что время может быть правильно разобран, на нем работает очень хорошо. Пользователь может ввести 14:00, 3:00 PM и т. Д., И Rails может его проанализировать. Если они вводят «asdfasdf» или любое значение, которое не может быть проанализировано как действительное время, пользователь уведомляется посредством ошибки проверки формы, и запись не сохраняется.
Но поскольку этот код стоит, он также вызывает ошибку проверки, если значение остается пустым.
Итак, я хочу, чтобы он прошел проверку с нулевым значением, но сбой, если есть какое-то значение, которое невозможно разобрать.
Я пробовал:
validates :start_time, time: true, allow_blank: true
, но затем "asdfasdf" пройдет. Я также пробовал
Time.parse(value.to_s) unless value.nil?
но опять же, что разрушает все это и позволяет пропустить недействительные даты.
Любые идеи?
1) Что происходит, когда вы используете allow_nil вместо пустой? 2) Поскольку у вас есть класс валидатора, возможно, используйте: validates_with (см. Doc http://edgeguides.rubyonrails.org/active_record_validations.html#format). Я посмотрел на него сам на днях, но не использовал его. Поэтому я не уверен, что это помогает. – Mauddev