通过解析select_date表单助手来创建日期对象有时只能工作

时间:2015-11-08 01:44:58

标签: ruby-on-rails ruby

以下是表格中的相关部分:

<%= select_date(@end_date, {order: [:month, :day, :year], start_year: 2009, end_year: Time.now.year, prefix: "end_date"},{class: "form-control date-select"} ) %>

以下是提交表单时传递的参数:

=> {"utf8"=>"✓",
 "authenticity_token"=>”123”,
 "end_date"=>{"month"=>"8", "day"=>"25", "year"=>"2014"},
 "commit"=>"Submit",
 "controller"=>”some_controller”,
 "action"=>”some_action”}

在控制器中,我是如何从params创建日期对象的:

Date.parse params["end_date"].values.join("-")

奇怪的是它有时只能起作用。例如,当用户选择上述日期(2015年8月25日)时,会出现以下错误:

invalid date

它突出显示我正在解析日期的区域:

Date.parse params["end_date"].values.join("-")

1 个答案:

答案 0 :(得分:1)

所以,这个表达式:

params["end_date"].values.join("-")

会给你字符串'8-25-2014'。解析日期时,ruby正在尝试猜测您正在使用的格式,在这种情况下,它使用dd-mm-yyyy。这意味着您认为11月10日的内容将被Ruby读取为10月11日(这比第25个月的例外更糟)。

最佳解决方案 - 不要使用解析。你已经知道了这些值,为什么让解析器有机会犯错?

Date.new *params[:end_date].values_at(:year, :month, :day).map(&:to_i)

注意:您仍然需要在begin rescue中包含上面的代码,因为您的用户可以(并且将)选择2月31日之类的日期。