我只在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而不是传入的值。
显然我可以查看参数,但我希望有更优雅的东西。
答案 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