首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >参数超出范围Rails 4和bootstrap3-datetimepicker rails

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

Stack Overflow用户
提问于 2014-05-06 23:27:19
回答 4查看 8.4K关注 0票数 16

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

我添加了所需的依赖项,并在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>

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

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相同,在新的customer表单中有一个用于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

有什么想法吗?对于应该将该字段设置为DateTime还是DateTime (当前),有什么偏好吗?现在,我们在中部时区工作,但情况不会总是这样。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-07 02:53:32

@Uri Agassi是对的:在这里,您传递给创建WorkOrder的值是最相关的。

尝试使用bootstrap-datepicker提供的custom date formatting options。如果你能得到一种看起来不错且易于在后端解析的格式,那么你会想要在该参数进入模型进行验证之前截取它。

无论您在客户端使用什么进行日期格式化,您仍然希望在控制器中将其解析为可用的DateDateTime对象服务器端。Check out 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
票数 12
EN

Stack Overflow用户

发布于 2014-10-05 21:58:54

您可以通过更新模型中的值将修改全部从控制器中移除。我觉得这是一种更干净(和可重用)的方法。

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
票数 5
EN

Stack Overflow用户

发布于 2014-09-30 20:05:25

是我帮的忙:

要将application.js写入到结束文件,请执行以下操作:

$(function() {
  $('.datepicker').datepicker({format: 'dd-mm-yyyy'});
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23498845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档