1

我正在尝试验证两个日期属性,以便它们是连续的。

gem validates_timeliness非常适合验证不正确的日期,例如 2 月 31 日。

但是我正在尝试使用:before:after参数,但它不起作用。它接受 2012 年 12 月 31 日的开始日期,而结束日期设置为 2012 年 1 月 1 日。

我的模型:

class Meeting < ActiveRecord::Base
  attr_accessible :date_start, :date_end
  validates :date_start, :date_end, :presence => true

  # Ressource : https://github.com/adzap/validates_timeliness
  validates_date :date_start, :before => :date_end
  validates_date :date_end, :after => :date_start
end

validates_timeliness 允许做我想做的事还是不是为此而建的?

我宁愿避免使用两个 gem 来处理我的应用程序中的日期。我的意思是同时使用 validates_timeliness gem 和 date_validator gem。

===== 更新 =====

尽管我找不到原因,但有些东西无法与 validates_timeless 一起正常工作。即使我在我的模型中设置了以下验证,它也接受 date_start 是在今天之后:

validates_date :date_start, :before => lambda { Date.current }

我的/config/initializers/validates_timeliness.rb(供参考):

ValidatesTimeliness.setup do |config|
  # Extend ORM/ODMs for full support (:active_record, :mongoid).
  config.extend_orms = [ :active_record ]

  # Re-display invalid values in date/time selects
  config.enable_date_time_select_extension!

  # Handle multiparameter date/time values strictly
  config.enable_multiparameter_extension!

  # Shorthand date and time symbols for restrictions
  config.restriction_shorthand_symbols.update(
     :now   => lambda { Time.current },
     :today => lambda { Date.current }
   )
  # Use the plugin date/time parser which is stricter and extendable
  config.use_plugin_parser = false
end

请注意,如果我尝试将日期设置为 2 月 31 日,则会收到一条错误消息,告知日期不正确。每次更改配置后,我也会重新启动服务器。

===== 更新 2 =====

我什至尝试过这个无效的 hash_key,Rails 没有抱怨:

  validates_date :date_start, :blablabla => lambda { Date.current }

发生什么了 ?我究竟做错了什么 ?

===== 更新 3 =====

这似乎是一个错误。这两个选项确实有效:

  validates_date :date_start, :on_or_before => lambda { Date.current }
  validates_date :date_start, :on_or_after => lambda { Date.current }

这两个选项不起作用:

  validates_date :date_start, :before => lambda { Date.current }
  validates_date :date_start, :after => lambda { Date.current }

我正在使用 Rails 3.2.9 和 Ruby 1.9.3p194。

有人可以确认他有同样的问题吗?

4

1 回答 1

3

我没有使用过这个 gem,但它们似乎支持 lambda 的值。尝试以下(应该)将您的 Meeting 实例传递给 lambda 并将结果返回给验证方法。它必须在 lambda 中完成,因为它是特定于实例的。

  validates_date :date_start, :before => lambda{|m| m.date_end}
  validates_date :date_end, :after => lambda{|m| m.date_start}
于 2012-11-30T22:47:52.017 回答