rails 验证语句中的 lambda 表达式

A lambda expression in a rails validation statement

我正在使用 timeliness gem 进行时间和日期验证。

我的事件模型有一个时间字段存储一个字符串,如“11:15”,一个 start_dateend_date 存储一个日期对象。

我想要以下验证行为:

如果用户尝试在一年中的当天创建活动(因此 start_date == Date.today),并且时间是过去的时间(因此如果活动开始时是 15:30创建并且用户输入 11:30),则验证应该失败。也就是说,我们只希望在 日期是今天 或未来的时间创建事件,如果日期是今天 时间 ,则 [=28] =]在未来.

我正在为此尝试以下验证:

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 } }

但是它的行为不正确。即我能够创建一个 start_date 为 03/08/2015 且时间为 09:00 的事件,尽管它在 03/08/2015 为 15:31!请帮忙!

你的 lambda 没有多大意义,因为你到处都在使用符号 - :start_date == Date.today 将永远是 false。 lambda 在验证中的价值在于它们已传递给您的 Event 实例,因此您可以引用 event.start_date。我同意 @arthur.karganyan 的评论,如果你需要这么复杂的东西,作为一种方法使用起来会更容易。

但是,您也使这比您需要的复杂得多。看起来您将 start_datetime 作为单独的属性,这很难使用,因为它们往往会相互依赖。我建议将它们设为单个 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