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

Ruby on rails 参数超出范围Rails 4和bootstrap3 datetimepicker Rails,ruby-on-rails,ruby,datetime,twitter-bootstrap-3,runtime-error,Ruby On Rails,Ruby,Datetime,Twitter Bootstrap 3,Runtime Error,我使用gem允许用户在我的应用程序中使用“DateTime”属性存储工单的计划日期,但是当用户提交表单创建工单时,我得到一个参数超出范围错误,并且该日期与用户打开编辑屏幕时选择的日期大不相同。有趣的是,它过去是可以工作的,但我不知道有什么代码可以改变来破坏它 我添加了所需的依赖项,并在CSS/JS文件中包含了正确的指令: gem 'momentjs-rails', '~> 2.5.0' gem 'bootstrap3-datetimepicker-rails', '~> 3.0.0'

我使用gem允许用户在我的应用程序中使用“DateTime”属性存储工单的计划日期,但是当用户提交表单创建工单时,我得到一个参数超出范围错误,并且该日期与用户打开编辑屏幕时选择的日期大不相同。有趣的是,它过去是可以工作的,但我不知道有什么代码可以改变来破坏它

我添加了所需的依赖项,并在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>
以及我的参数白名单:

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
还有一个参数示例,当我保存表单时,这些参数会导致参数超出范围错误:

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相同,我在新的customer表单中有一个用于工作订单的嵌套表单,该表单上的所有其他内容都非常有效:

def create
  @customer = Customer.new(customer_params)

  ... [errors above]
end
如果日期和时间在现在的24小时内,则会正确保存,但即使保存正确,当我去编辑该工单时,该日期也会在文本字段中显示完全奇怪且未格式化。例如:

当我从日期选择器中选择日期时:2014年6月5日上午10:28

当我编辑工单时:2014-06-05 10:28:00.000000

有什么想法吗?当前是否应该将该字段设置为日期、时间或日期时间?现在,我们在中央时区工作,但情况并非总是如此


提前感谢你为我指明了正确的方向

@Uri Agassi是对的:创建WorkOrder所传递的值在这里最相关

尝试使用bootstrap datepicker提供给您的。如果您可以获得一种外观良好且易于在后端解析的格式,那么您将希望在参数进入模型进行验证之前拦截该参数

无论在客户端对日期格式化采用何种方式,您仍然希望将其解析为控制器中可用的日期或日期时间对象服务器端。您也可以在日期时调用strtime

未经测试,但想法是:

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
是我帮助的: 要将application.js文件写入结束文件,请执行以下操作:


通过更新模型中的值,可以同时删除控制器中的修改。我觉得这是一种更干净、可重用的方法

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

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

范例

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

你从哪里得到的错误?在控制器中?控制器代码在哪里?@UriAgassi:根据请求添加控制器代码。我的控制器中的强参数白名单方法也没有问题,所以我没有包括该方法。请帮助我们帮助您!如果您知道错误在第一行,您不认为customer_params和work_order_params的值是正确的吗relevant@UriAgassi完成。我没有得到任何未经许可的属性错误,所以我认为这不是什么大问题。我99%确定这与日期选择器发送的格式有关,或者与Ruby保存日期的奇怪方式有关。不确定。白名单不是值!给我们一个通过的样本值和一个失败的样本值,只需在第一行之前添加p work_order_参数,并向我们展示我是如何想念你的。这非常有效。非常感谢你。我只是对它在进入数据库之前不需要任何特殊格式就可以工作感到困惑,但不管怎样,rails 4.2.0不适合我。由于某种原因,在尝试将参数设置为属性之前,它不允许我截取参数并格式化它。@Sean在将参数作为强参数传递之前,您可以就地更新参数。看看这个stackoverflow:这似乎是一个比破解后端代码来处理前端小部件更干净的解决方案。下次我会试试的!就我而言,是“dd-mm-yy”。提交/保存ok。4'y在表格中显示了20152015。我自己永远不会想到这个。仍然习惯于MVC。似乎代码可以去很多地方。也从来没用过super。总是在学习。如果通过更新或更新属性来更新计划的日期,这是否有效?@NickSilva我不明白为什么不行
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
$(function () {
 $('#datetimepicker').datetimepicker({format: 'MMMM Do YYYY, h:mm'});
});