Rails日期检查是否可解析

Sha*_*r's 3 string parsing ruby-on-rails date

我有一个日期时间选择器,它通过搜索框发送签入和签出日期。然后,URL看起来像;

http://localhost:3000/locations/listings?utf8=%E2%9C%93&search=london&start_date=12%2F04%2F16&end_date=20%2F04%2F16
Run Code Online (Sandbox Code Playgroud)

然后我将params散列并解析字符串,

start_date = Date.parse(params[:start_date])
end_date = Date.parse(params[:end_date])
Run Code Online (Sandbox Code Playgroud)

首先,我必须检查一下 if (start_date.present? && end_date.present?),并且工作正常。

但是,如果用户手动键入其他内容而不是日期,例如;

http://localhost:3000/locations/listings?utf8=%E2%9C%93&search=london&start_date=londoneye6&end_date=20%2F04%2F16 
Run Code Online (Sandbox Code Playgroud)

然后,我当然会出错。

invalid date
Run Code Online (Sandbox Code Playgroud)

我应该如何控制字符串是否可在控制器操作中解析。我还应该检查london-eye, london/eye字符串,其中包括- /

谢谢

Mih*_*scu 5

您必须尝试解析字符串并进行救援 ArgumentError

begin
   myDate = Date.parse("31-01-2016")
rescue ArgumentError
   # handle invalid date
end
Run Code Online (Sandbox Code Playgroud)

一行(请注意,这可以挽救所有错误)

myDate = Date.parse("31-01-2016") rescue nil
Run Code Online (Sandbox Code Playgroud)


Мал*_*евъ 5

您可以使用 验证时间Date.parse,并ArgumentError在解析返回nil时捕获异常:

控制器

def param_date date
   Date.parse(date)
rescue ArgumentError
   nil
end

start_date = param_date(params[:start_date])
end_date = param_date(params[:end_date])
Run Code Online (Sandbox Code Playgroud)