2010-09-29 51 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 

之后,你只检查是否保存返回true或false。当您不验证模型时发送False。如果虚假重定向到另一个控制器。

编辑:

像由西蒙Carletti酒店表示,评论,您可以使用#past?

validate :not_past_date 

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

必须使用的,而不是Time.now Date.today。我们无法比较日期和时间downvote。但你仍然向我展示了正确的答案。请编辑正确的答案 – Rohit 2010-09-29 06:59:32

+0

另外,罗希特,你应该接受答案,如果它是正确的。 – Codebeef 2010-09-29 07:06:53

+0

@ Mr.Matt做到了这一点:D – Rohit 2010-09-29 07:08:06

1

@Simone和@shingara使用#past?方法会将UTC与当前日期时间进行比较。所以,你可以在两种情况下这里面临一个问题:

  1. 如果你想获得一个日期时间集合中的所有元素,每天它们是否开始在一天或没有的开始;

  2. 如果您正在处理另一个时区。

有变通办法来对付它,但是做的第一@shingara方式,它只是更直白:self.date < Date.today