2010-09-29 2 views
1

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

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

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

ответ

7

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

validate :not_past_date 

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

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

Edit:

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

validate :not_past_date 

def not_past_date 
    if self.date.past? 
    errors.add(:date, 'not in past') 
    end 
end 
+0

Вы должны использовать Date.today вместо Time.now. мы не можем сравнивать дату со временем downvote для этого. но все же вы показали мне правильный путь, поэтому правильный ответ. Пожалуйста, отредактируйте ответ на правильный. – Rohit

+0

Кроме того, Rohit, вы должны принять ответ, если он правильный. – Codebeef

+0

@ Mr.Matt сделал это: D – Rohit

1

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

Eeh, в Rails вы должны путы валидации в модели (не в контроллере!). См.: http://guides.rubyonrails.org/active_record_validations_callbacks.html.

1

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

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

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

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

Смежные вопросы