Пользовательский валидатор для предотвращения назначения встречи слишком рано?

Я создаю приложение Rails 4 с моделью назначения. Я пытаюсь понять, как написать собственный валидатор, чтобы пользователи не могли планировать встречи до 6:30 утра и после 9:00 вечера. DateTime — это тип данных поля Assessment_date моей модели.

Моя первоначальная мысль состояла в том, чтобы написать метод в моей модели для определения проверки, но я не знаю, как структурировать такой метод и является ли это лучшим подходом к решению проблемы.

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


person codeinspired    schedule 31.12.2014    source источник


Ответы (1)


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

создайте app/validators/during_business_hours_validator.rb с помощью:

class DuringBusinessHoursValidator < ActiveModel::EachValidator

  def validate_each(record, attribute, value)
    # example - do whatever you want here
    unless value.present? && during_business_hours(value)
      record.errors[attribute] << 'must be during business hours'
    end
  end

  def during_business_hours(time)
    # from http://stackoverflow.com/q/10090962/525478
    Range.new(
      Time.local(time.year, time.month, time.day, 6, 30),
      Time.local(time.year, time.month, time.day, 21)) === time
  end

end

затем в вашей модели добавьте:

validates :appointment_date,
          during_business_hours: true
person Brad Werth    schedule 31.12.2014
comment
Спасибо за ваш ответ. Я изучаю Rails и не совсем понимаю совет, особенно первый метод. Я не понимаю, что делает этот первый метод и как он работает. Заменять ли чем-то записи, атрибуты, значения в методе? Пожалуйста, объясните, что делает первый метод, и как я должен его использовать. Когда вы говорите, делайте здесь что хотите, что вы имеете в виду? Какие вещи я мог бы поместить в эту часть метода относительно моей цели? Наконец, могу ли я разместить этот пользовательский валидатор в любом месте файлового дерева Rails? Я очень ценю вашу помощь! - person codeinspired; 31.12.2014