Оцените, является ли дата не одной из прошлых дат в модели - Ruby on Rails - PullRequest
1 голос
/ 29 сентября 2010

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

Есть ли способ поместить эту проверку в модель или где-либо еще иесли дата является прошедшей датой, то она должна перенаправить обратно к новому действию с сообщением «Дата не может быть прошедшей датой»

Пожалуйста, помогите Спасибо заранее

Ответы [ 3 ]

7 голосов
/ 29 сентября 2010

В вашей модели необходимо добавить подтверждение

validate :not_past_date

def not_past_date
  if self.date < Date.today
    errors.add(:date, 'not in past')
  end
end

После того, как в вашем контроллере, вы просто проверяете, возвращает ли значение true или false Ложь отправляется, когда вы не проверяете свою модель. Если false, перенаправить на другой контроллер.

Редактировать:

Как сказал Симоне Карлетти в комментарии, вы можете использовать #past?

validate :not_past_date

def not_past_date
  if self.date.past?
    errors.add(:date, 'not in past')
  end
end
1 голос
/ 01 сентября 2011

@ Симона и @shingara используют #past? Метод будет сравнивать дату с текущим DateTime в UTC. Таким образом, вы можете столкнуться с проблемой в двух случаях:

  1. Если вы хотите, чтобы все элементы с DateTime были установлены на день, были ли они начаты в начале дня или нет;

  2. Если вы работаете в другой TimeZone.

Есть обходные пути, чтобы справиться с этим, но проще сделать первый путь @shingara: self.date < Date.today

1 голос
/ 29 сентября 2010

Я знаю, что могу поставить эту проверку в контроллере, но я думаю, что она нарушает правила MVC, то есть держит бизнес-логику подальше от контроллеров.1005 * должен поставить проверки в модели (не в контроллере!).Смотри: http://guides.rubyonrails.org/active_record_validations_callbacks.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...