我正在使用 timeliness gem进行时间和日期验证。
我的事件模型有一个时间字段存储一个字符串,如“11:15”,一个 start_date
和 end_date
存储日期对象。
我想要以下验证行为:
如果用户尝试在一年中的当天创建事件(所以 start_date == Date.today
),并且时间是过去的时间(所以如果创建事件时是 15:30,并且用户输入 11 :30),那么验证应该会失败。也就是说,我们只希望在日期是今天或 future 的地方创建事件,而时间,如果日期是今天,则是 future 强>.
我正在为此尝试以下验证:
validates :time, :presence => true,
:timeliness => { :type => :time, :on_or_after => lambda { if(:start_date == Date.today && :day_of_week.downcase == Date.today.strftime("%A").downcase) then return Time.new(:time.to_s).in_time_zone(:timezone)>Time.now.in_time_zone(:timezone) else return true end } }
但是它的行为不正确。即我能够创建一个开始日期为 03/08/2015 和时间为 09:00 的事件,尽管它是 03/08/2015 的 15:31!请帮忙!
最佳答案
您的 lambda 没有多大意义,因为您到处都在使用符号 - :start_date == Date.today
将始终为 false
。 lambda 在验证中的值(value)在于它们传递了您的 Event
实例,因此您可以引用 event.start_date
。我同意 @arthur.karganyan在评论中说,如果您需要这么复杂的东西,作为一种方法使用起来会更容易。
但是,您也使这比您需要的复杂得多。看起来您将 start_date
和 time
作为单独的属性,这很难使用,因为它们往往会相互依赖。我建议将它们设为单个 start_time
属性,然后您可以使用 validates_timeliness
像这样:
validates_datetime :start_time, on_or_after: -> { Time.now }
如果您必须具有单独的属性,您的验证可能如下所示:
validates_date :start_date, on_or_after: -> { Date.today }
validates_time :time, on_or_after: lambda { |event| Time.now if event.start_date.today? }
这会验证日期是今天还是将来,如果是今天,还会检查时间。当 on_or_after
lambda 评估为 nil
时,validates_timeliness
似乎接受任何time
。
关于ruby-on-rails - Rails 验证语句中的 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31790018/