如何编写自定义验证器以防止在 Rails 4 应用程序中保存过去时间的当天约会?
How to write a custom validator to prevent saving same day appointments at past times in Rails 4 app?
我在编写我的第一个应用程序时正在学习 Rails。我的应用程序有一个预约模型,它是一个具有以下列(和数据类型)的联接 table:date(日期)、starts_at(时间)和 ends_at(时间)。我正在尝试编写一种自定义验证方法,以防止用户无意中安排过去 starts_at 次的同一天约会。换句话说,同一天约会的 starts_at 时间必须始终大于当前时间。
例如:假设今天是 2015 年 1 月 12 日,星期一,当前时间是 12:00 下午。我需要模型验证以防止用户安排今天上午 6:30 的约会,因为那个时间已经过去了(根据服务器的时区)。
这是我尝试编写自定义验证和方法来完成 objective:
的失败尝试
validate :past_time_appointment
private
def past_time_appointment
if self.date == Date.current && self.starts_at < Time.now
errors.add(:starts_at, "can't be in the past")
end
end
此代码无法正常运行。在研究这个问题时,我发现另一个 Whosebug post 解决了这个问题,但它不是一个 Rails 项目。它与 C# 中的 ASP.NET MVC 1 应用程序有关。
在 Rails 4 中解决此问题的最佳方法是什么?我的代码不起作用,但我不确定为什么。如果有任何建议和帮助,我将不胜感激!
重新思考后解决了这个问题。我放弃了以前的方法并写了一个新方法:
private
def today_appointment
self.date == Date.current
end
然后我使用 Validates_Timeliness gem ( https://github.com/adzap/validates_timeliness ) 调用方法:
validates_time :starts_at, :after => :now, :if => :today_appointment
在我的约会模型中放置验证可防止用户保存过去 "starts_at" 时间的当天约会。验证中的 ":if" 语句 "scopes" 仅适用于当天。这是为了防止验证阻止其他日期的约会。这种方法完成了我的 objective。我希望这对以后遇到这个问题的其他人有所帮助。
我在编写我的第一个应用程序时正在学习 Rails。我的应用程序有一个预约模型,它是一个具有以下列(和数据类型)的联接 table:date(日期)、starts_at(时间)和 ends_at(时间)。我正在尝试编写一种自定义验证方法,以防止用户无意中安排过去 starts_at 次的同一天约会。换句话说,同一天约会的 starts_at 时间必须始终大于当前时间。
例如:假设今天是 2015 年 1 月 12 日,星期一,当前时间是 12:00 下午。我需要模型验证以防止用户安排今天上午 6:30 的约会,因为那个时间已经过去了(根据服务器的时区)。
这是我尝试编写自定义验证和方法来完成 objective:
的失败尝试validate :past_time_appointment
private
def past_time_appointment
if self.date == Date.current && self.starts_at < Time.now
errors.add(:starts_at, "can't be in the past")
end
end
此代码无法正常运行。在研究这个问题时,我发现另一个 Whosebug post 解决了这个问题,但它不是一个 Rails 项目。它与 C# 中的 ASP.NET MVC 1 应用程序有关。
在 Rails 4 中解决此问题的最佳方法是什么?我的代码不起作用,但我不确定为什么。如果有任何建议和帮助,我将不胜感激!
重新思考后解决了这个问题。我放弃了以前的方法并写了一个新方法:
private
def today_appointment
self.date == Date.current
end
然后我使用 Validates_Timeliness gem ( https://github.com/adzap/validates_timeliness ) 调用方法:
validates_time :starts_at, :after => :now, :if => :today_appointment
在我的约会模型中放置验证可防止用户保存过去 "starts_at" 时间的当天约会。验证中的 ":if" 语句 "scopes" 仅适用于当天。这是为了防止验证阻止其他日期的约会。这种方法完成了我的 objective。我希望这对以后遇到这个问题的其他人有所帮助。