我在编写第一个应用程序时学习Rails。我的应用程序有一个apppointment模型,它是一个包含以下列(和数据类型)的连接表:date(date),starts_at(time)和ends_at(time)。我正在尝试编写一种自定义验证方法,以防止用户无意中调度过去的starts_at次的SAME日约会。换句话说,同一天约会的starts_at时间必须始终大于当前时间。
例如:今天是2015年1月12日星期一,当前时间是中午12:00。我需要进行模型验证,以防止用户在今天早上6:30安排约会,因为该时间已经过去(按照服务器的时区)。
这是我尝试编写自定义验证的失败&实现目标的方法:
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
此代码无法正常运行。在研究这个问题的同时,我找到了另一个解决这个问题的Stackoverflow帖子,但它不是一个Rails项目。它与C#中的ASP.NET MVC 1应用程序有关。
在Rails 4中解决此问题的最佳方法是什么?我的代码不起作用,但我不确定原因。我很感激任何建议和帮助!
答案 0 :(得分:0)
我在重新思考之后解决了这个问题。我放弃了以前的方法并写了一个新方法:
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”语句仅限于当前日期。这是为了防止验证在其他日子阻止约会。这种方法实现了我的目标。我希望这可以帮助将来遇到这个问题的其他人。