【发布时间】:2015-08-17 15:14:49
【问题描述】:
我的应用程序有两次用户输入,为了方便用户,我计算了它们之间的时间量。所以用户输入 1:00 AM 作为开始时间,2:00 AM 作为停止时间,它会输出“1 小时”。我有一个辅助方法可以做到这一点,使用宝石进行繁重的工作。时间以 Time 数据类型存储在数据库中,以使其正常工作。
一切正常,现在我想验证用户输入的时间是否有效——但也不需要它。因此,如果用户在这些时间没有输入任何内容,记录仍然会保存 - 但如果用户输入,说“asdfasdf”,我希望触发验证并说这是一个无效时间,而不是默默地不存储时间.
我像这样创建了自己的自定义时间验证:
class TimeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
Time.parse(value.to_s)
rescue ArgumentError
record.errors[attribute] << (options[:message] || "is not a valid time")
end
end
然后在我的模型中,我正在做:
validates :start_time, time: true
validates :stop_time, time: true
只要确保可以正确解析时间,这就是我想要的,它工作得很好。用户可以输入 14:00、3:00 PM 等……Rails 可以解析它。如果他们输入“asdfasdf”或任何无法解析为有效时间的值,则会通过表单验证错误通知用户并且不会保存记录。
但就该代码而言,如果该值留空,它也会触发验证错误。
同样,我希望它通过 nil 值的验证,但如果存在无法解析的某些值则失败。
我试过了:
validates :start_time, time: true, allow_blank: true
但是“asdfasdf”会通过。我也试过了
Time.parse(value.to_s) unless value.nil?
但同样,这会破坏整个事情并允许无效日期通过。
有什么想法吗?
【问题讨论】:
-
1) 当您使用 allow_nil 而不是空白时会发生什么? 2)因为你有一个验证器类,也许使用:validates_with(见文档edgeguides.rubyonrails.org/…)我前几天自己调查过,但没有使用它。所以我不确定它是否有帮助。
标签: ruby-on-rails ruby validation ruby-on-rails-4 time