ruby-on-rails - Rails 验证语句中的 lambda 表达式

标签 ruby-on-rails ruby validation ruby-on-rails-4 time

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

我的事件模型有一个时间字段存储一个字符串,如“11:15”,一个 start_dateend_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_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

关于ruby-on-rails - Rails 验证语句中的 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31790018/

相关文章:

ruby-on-rails - 如何简化大条件

ruby-on-rails - 参数丢失或值为空 : user

ruby-on-rails - 使用电子表格 gem 导出 Excel 文件

ruby - 如何在 ruby​​ 中进行 base58 编码?

java - 业务逻辑验证模式和建议

css - 图像未正确调整大小 : image gets cut off when window is resized

ruby-on-rails - "Postmark::InvalidMessageError: Provide either email TextBody or HtmlBody or both."用于 rails 3.2 应用程序

ruby-on-rails - 处理 ruby​​ 1.8.7 中不同类型的 utf 连字符

ruby-on-rails - 目录 : How do I validate my pages when sometimes I have CSS links not in the HEAD?

python - Django 表单验证 : get errors in JSON format