我正在尝试验证两个日期属性,以便它们是连续的。
宝石 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。
有人能证实他有同样的问题吗?
答案 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}