以下是表格中的相关部分:
<%= 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("-")
答案 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日之类的日期。