参数超出范围Rails 4和bootstrap3-datetimepicker-rails

我正在使用bootstrap3-datetimepicker-rails gem让用户在我的应用程序中存储WorkOrderscheduled_date (’DateTime’属性),但当用户提交表单以创建时,我得到一个argument out of range错误的argument out of range WorkOrder ,日期与用户弹出打开编辑屏幕时选择的日期非常不同。 有趣的是,它曾经工作,但我不知道什么代码可以改变来打破它。

我添加了所需的依赖项并在我的CSS / JS文件中包含了正确的指令:

 gem 'momentjs-rails', '~> 2.5.0' gem 'bootstrap3-datetimepicker-rails', '~> 3.0.0' 

据我所知,我的代码看起来与文档中的示例相同。 这是我的表格的片段:

  
$(function () { $('#service_date_picker').datetimepicker({ icons: { time: "fa fa-clock-o", date: "fa fa-calendar", up: "fa fa-arrow-up", down: "fa fa-arrow-down" } }); });

编辑(忘了添加控制器代码 – 超级简单):

work_orders_controller.rb

 def create @work_order = WorkOrder.new(work_order_params) ... [it errors on the line above] end 

我的参数白名单:

 def work_order_params params.require(:work_order).permit(:caller_name, :brief_job_details, :contract_price, :quoted_by, :job_description, :scheduled_date, :time_materials_details, :sheduled_time, :contact_name, :payment_method, :notes, :customer_id, :job_site_id) end 

以及在保存表单时使argument out of range错误的参数示例:

 work_orders_attributes"=>{"0"=>{"caller_name"=>"Justin", "time_materials_details"=>"", "contract_price"=>"", "quoted_by"=>"", "payment_method"=>"", "job_description"=>"", "scheduled_date"=>"05/23/2014 1:28 PM", "notes"=>""}} 

与我的customers_controller.rb相同,我在新客户表单中有一个WorkOrder的嵌套表单(该表单上的其他所有内容都可以正常工作):

 def create @customer = Customer.new(customer_params) ... [errors above] end 

如果日期和时间在24小时之内正确保存,但即使正确保存,当我去编辑WorkOrder时,日期在文本字段中显示完全奇怪WorkOrder 。 例如:

当我从日期选择器中选择日期时: 05/06/2014 10:28 AM

当我编辑WorkOrder2014-06-05 10:28:00.000000

有任何想法吗? 是否应该将该字段DateTime DateTimeDate Time (当前)? 现在,我们正在中央时区工作,但情况并非总是如此。

提前感谢您指出我正确的方向!

@Uri Agassi是对的:这是你创建与这里最相关的WorkOrder的价值。

尝试使用bootstrap-datepicker datepicker提供给您的bootstrap-datepicker 定义日期格式选项 。 如果您可以获得一个看起来很好且易于在后端解析的格式,那么您需要在该参数进入模型进行validation之前拦截该参数。

无论您在客户端进行日期格式化,您仍然希望将其解析为控制器中可用的DateDateTime对象服务器端。 查看DateTime#strptime 。 您也可以在Date调用#strptime

未经测试,但想法是:

 def create order_params = work_order_params order_params[:scheduled_date] = Date.strptime(order_params[:scheduled_date], '%m/%d/%Y %I:%M %p') @work_order = WorkOrder.new(order_params) end 

您可以通过更新模型中的值来一起从Controller中删除修改。 我觉得这是一种更清洁(和可重复使用)的方法。

 class Work < ActiveRecord::Base def scheduled_date=(date) begin parsed = Date.strptime(date,'%m/%d/%Y %I:%M %p') super parsed rescue date end end end 

这是我的帮助:
要将application.js写入结束文件:

 $(function() { $('.datepicker').datepicker({format: 'dd-mm-yyyy'}); }); 

这个插件使用moment.js。 基本上你需要选择你想要的时间格式。

 $(function () { $('#datetimepicker').datetimepicker({format: 'MMMM Do YYYY, h:mm'}); });