rails 验证语句中的 lambda 表达式
A lambda expression in a rails validation statement
我正在使用 timeliness gem 进行时间和日期验证。
我的事件模型有一个时间字段存储一个字符串,如“11:15”,一个 start_date
和 end_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_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
我正在使用 timeliness gem 进行时间和日期验证。
我的事件模型有一个时间字段存储一个字符串,如“11:15”,一个 start_date
和 end_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_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