我正在使用bootstrap3-datetimepicker-rails gem来让用户将scheduled_dateWorkOrder存储在我的应用程序中(“DateTime”属性),但是当用户提交表单以创建argument out of range时,却出现了WorkOrder错误,并且日期为与用户 pop 打开编辑屏幕时所选择的内容完全不同。有趣的是,它曾经可以工作,但我不知道可以更改哪些代码来破坏它。

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

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

据我所知,我的代码看起来与文档中的示例相同。这是我表格的摘录:
  <div class="row">
    <div class="col-md-4">
      <div class="form-group">
        <%= f.label :scheduled_date %>
        <div class='input-group date'>
          <span class="input-group-addon"><span class="fa fa-calendar"></span></span>
          <%= f.text_field :scheduled_date,  class: 'form-control input-lg', id: "service_date_picker" %>
        </div>
      </div>
    </div>
  </div>


  <script type="text/javascript">
      $(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"
          }
        });
      });
  </script>

编辑(忘记添加 Controller 代码- super 简单):

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时,日期在文本字段中也将显示为完全奇怪且无格式。例如:

当我从日期选择器中选择日期时:05/06/2014 10:28 AM
当我编辑WorkOrder时:2014-06-05 10:28:00.000000
有任何想法吗?是否希望我将该字段设置为DateTimeDateTime(当前)?目前,我们正在中部时区工作,但情况并非总是如此。

预先感谢您指出正确的方向!

最佳答案

@Uri Agassi是正确的:这是您在此处创建最相关的WorkOrder所传递的值。

尝试处理bootstrap-datepicker提供给您的custom date formatting options。如果可以得到一种看起来不错并且易于在后端解析的格式,那么您将需要在该参数进入模型进行验证之前对其进行拦截。

不管客户端使用什么格式进行日期格式化,您仍然希望将其解析为 Controller 中服务器端可用的DateDateTime对象。 Check out DateTime#strptime 。您还可以在#strptime上调用Date

未经测试,但想法存在:

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

10-04 19:19