在Rails中,如何在validates_timeliness gem的基础上验证两个日期属性?

时间:2012-11-30 19:40:30

标签: validation date ruby-on-rails-3.2

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

宝石 validates_timeliness 非常适合验证错误的日期,例如2月31日。

但是我正在尝试使用:之前:之后参数,但它不起作用。它接受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是否允许执行我想要的或不是为此而构建的?

我宁愿避免在我的应用中使用两个宝石来处理日期。我的意思是使用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。

有人能证实他有同样的问题吗?

1 个答案:

答案 0 :(得分:3)

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

  validates_date :date_start, :before => lambda{|m| m.date_end}
  validates_date :date_end, :after => lambda{|m| m.date_start}