2013-07-24 67 views
0

我在rails中创建了一个REST API,只是更新了。我想要做的就是能够传入时间戳并更新结果记录。Rails时间戳验证避免null

我只是利用的

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

@my_class.update_attributes!(params) 

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

当前的默认行为是安静地将该字段设置为空。 什么是最好得到这个抛出一个错误呢? 我试图做一个validate_format_of但由于它被设置为null,它只是验证了空,而不是价值被移交。

很显然,我可以只检查参数,但我希望的东西更优雅。

+0

做了我的回应的帮助你有你的问题吗? – Powers

回答

0

您确定allow_blank和allow_nil都是false吗?

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 
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:未提供SS:毫米

>> 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