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

Kyl*_*son 16 ruby datetime runtime-error ruby-on-rails twitter-bootstrap-3

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

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

gem 'momentjs-rails', '~> 2.5.0'
gem 'bootstrap3-datetimepicker-rails', '~> 3.0.0'
Run Code Online (Sandbox Code Playgroud)

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

  <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>
Run Code Online (Sandbox Code Playgroud)

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

work_orders_controller.rb

def create
  @work_order = WorkOrder.new(work_order_params)

  ... [it errors on the line above]
end
Run Code Online (Sandbox Code Playgroud)

我的参数白名单:

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
Run Code Online (Sandbox Code Playgroud)

以及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"=>""}}
Run Code Online (Sandbox Code Playgroud)

与我的新客户表单内部的customers_controller.rb嵌套表单相同WorkOrder(该表单上的其他内容完美运行):

def create
  @customer = Customer.new(customer_params)

  ... [errors above]
end
Run Code Online (Sandbox Code Playgroud)

如果日期和时间在24小时之内,则可以正确保存日期和时间,但即使正确保存,当我进行编辑时,日期在文本字段中显示完全奇怪且未格式化WorkOrder.例如:

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

当我编辑WorkOrder:2014-06-05 10:28:00.000000

有任何想法吗?任何偏爱我是否应该作出这样的领域Date,TimeDateTime(目前)?现在,我们正在中央时区工作,但情况并非总是如此.

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

Ben*_*ger 12

@Uri Agassi是对的:这是你传递的价值,WorkOrder它们是最相关的.

尝试使用提供给您的自定义日期格式选项bootstrap-datepicker.如果你可以得到一个看起来很好并且很容易在后端解析的格式,那么你需要在它进入模型进行验证之前截取该参数.

无论您在客户端进行日期格式化,您仍然希望将其解析为控制器中的可用DateDateTime对象服务器端.退房DateTime#strptime.您也可以拨打#strptimeDate.

未经测试,但想法是:

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
Run Code Online (Sandbox Code Playgroud)


use*_*929 5

您可以通过更新模型中的值来一起从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
Run Code Online (Sandbox Code Playgroud)