我有一个包含日期列的日模型。我必须实现验证日期列不能有过去的日期。如果日期是过去的日期,则不得将其保存到数据库并在其上提供适当的错误消息。我知道我可以将这种验证放在控制器中,但我认为这违反了MVC规则,即保持业务逻辑远离控制器。评估日期是否不是模型中的过去日期之一 - Ruby on Rails
有什么办法把这个验证模型或其他地方,如果日期是过去的日期,那么它必须重定向到与该消息的新动作“日期不能是过去的日期”
请帮助 在此先感谢
我有一个包含日期列的日模型。我必须实现验证日期列不能有过去的日期。如果日期是过去的日期,则不得将其保存到数据库并在其上提供适当的错误消息。我知道我可以将这种验证放在控制器中,但我认为这违反了MVC规则,即保持业务逻辑远离控制器。评估日期是否不是模型中的过去日期之一 - Ruby on Rails
有什么办法把这个验证模型或其他地方,如果日期是过去的日期,那么它必须重定向到与该消息的新动作“日期不能是过去的日期”
请帮助 在此先感谢
在你的模型,你需要在你的控制器中添加一个验证
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
我知道我可以把这个验证在 控制器,但我认为这 违反了MVC的规则,即保持 业务逻辑从 控制器了。
英皇酒店,Rails中你应该放验证模型(不控制器!)。参见: http://guides.rubyonrails.org/active_record_validations_callbacks.html。
@Simone和@shingara使用#past?方法会将UTC与当前日期时间进行比较。所以,你可以在两种情况下这里面临一个问题:
如果你想获得一个日期时间集合中的所有元素,每天它们是否开始在一天或没有的开始;
如果您正在处理另一个时区。
有变通办法来对付它,但是做的第一@shingara方式,它只是更直白:self.date < Date.today
必须使用的,而不是Time.now Date.today。我们无法比较日期和时间downvote。但你仍然向我展示了正确的答案。请编辑正确的答案 – Rohit 2010-09-29 06:59:32
另外,罗希特,你应该接受答案,如果它是正确的。 – Codebeef 2010-09-29 07:06:53
@ Mr.Matt做到了这一点:D – Rohit 2010-09-29 07:08:06