Rails时间戳验证避免null

时间:2013-07-24 21:45:11

标签: ruby-on-rails regex validation

我只在rails中创建了一个REST API。我想要做的是能够传入时间戳并用结果更新记录。

我只是在使用

@my_class = MyClass.find(params[:id])

@my_class.update_attributes!(params)

并且这可以正常工作,但是当在'2013-07-08 20:00'中传递一个值时,我想抛出一个错误的请求,因为我只想要格式为'yyyy-mm-dd hh:mm:ss'的日期

当前的默认行为是将字段静默设置为null。 什么是最好让这个引发错误? 我尝试过validate_format_of,但由于它被设置为null,它只是验证null而不是传入的值。

显然我可以查看参数,但我希望有更优雅的东西。

2 个答案:

答案 0 :(得分:0)

你确定allow_blank和allow_nil都是假的吗?

validates_format_of :my_time_stamp, with: /[0-9]{1,4}/[0-9]{1,2}/[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}/, :allow_nil => false, :allow_blank => false

答案 1 :(得分:0)

我认为Time#parse是比正则表达式匹配更好的解决方案。这可以在成功解析字符串时返回Time对象:

>> Time.parse("'2013-07-08 20:00'")
=> 2013-07-08 20:00:00 -0400

当无法解析字符串时,会引发错误:

>> Time.parse("meow")
ArgumentError: no time information in "meow"

这完全不符合您的规格,因为某些字段不是必需的。例如,这不会引发错误。

>> Time.parse('2013-07-08')
=> 2013-07-08 00:00:00 -0400

解析时间并格式化输出应符合您的要求。当未提供hh:mm:ss时,这将正确评估为false:

>> str = '2013-07-08'
=> "2013-07-08"
>> Time.parse(str).to_formatted_s(:db) == str
=> false

当提供hh:mm:ss时,它将评估为true:

>> str = '2013-07-08 20:00:45'
=> "2013-07-08 20:00:45"
>> Time.parse(str).to_formatted_s(:db) == str
=> true
相关问题