为什么我的约会在某些日期超出范围而不在其他日期?

时间:2014-08-29 21:04:16

标签: date ruby-on-rails-4 bootstrap-datepicker outofrangeexception

我在我的rails 4.0.9项目中使用了bootstrap-datepicker-rails(v.1.3.0.2),并在开发和生产中看到了一些奇怪的行为,正如标题所解释的那样。我已经看过this question了,但似乎我的问题与OP不同,更奇怪。

与他一样,我在提交表单时遇到argument out of range错误(无论是create操作还是update操作),但只针对某些人约会,而不是其他人。

例如,此日期超出范围(从我的开发日志中复制 - 从发送到控制器的参数的片段):

"date_received"=>"08/28/2014"

然而这个日期还可以:

"date_received"=>"08/07/2014"

我认为某些日期选择保存正确的事实排除了格式问题。我很难知道如何发生这种情况。 2014年8月13日之前的任何日期都有效,之后的任何日期都会返回超出范围的错误。

这里有丑陋的细节:

的application.js:

//= require jquery
//= require jquery.turbolinks
//= require jquery.tablesorter
//= require jquery_ujs
//= require bootstrap
//= require bootstrap-datepicker/core
//= require jquery-ui
//= require turbolinks

application.css:

*= require jquery-ui/theme
*= require bootstrap-datepicker
*= require font-awesome
*= require custom
*= require theme.blue
*= require_self

jobs.js.coffee:

$(document).ready ->

  $ ->
    $(".tablesorter").tablesorter( {sortList: [[2,0]]} )
    $('.datepicker').datepicker()

    return

job.rb:

(对相关领域的验证):

validates :date_received, presence: true

jobs_controller.rb:

(发生错误的行):

if @job.update_attributes(job_params)

job_params定义:

def job_params
  params.require(:job).permit(:number, :name, :display_name, :date_received, :market, 
  :job_type, :pose_selection, :pose_selection_label, :pose_selection_deadline, 
  :pk_id, :pk, :flyout_id, :flyouts, :code, :tax_rate, :shipping_handling, :mail_home, 
  :mail_home_amount, :line, :notes, :entered, :entered_by, :verified, :verified_by, 
  :printed, :printed_by, :assembled_by, :shipped, :active, :discount_amount, :data)
end

我从哪里开始排查故障?

1 个答案:

答案 0 :(得分:1)

bootstrap-datepicker-rails返回的日期的默认格式为" mm-dd-yyyy"。以这种方式格式化提交日期要么不正确地保存日期​​,要么导致"超出范围"错误,因为Rails误将当天误解为月份。不要@SteveTurczyn让我看到这个事实。

@AndrewMorton建议让bootstrap-datepicker-rails提交一个Date而不是String,但是那个gem,AFAIK中没有内置这样的机制。

所以我需要更改datepicker返回的String的格式。经过一些控制台测试后,我发现了一种格式为" dd-mm-yyyy"会成功保存(当然还有其他格式)。

更改此行(来自jobs.js.coffee):

$('.datepicker').datepicker()

......对此:

$('.datepicker').datepicker( { dateFormat: 'dd-mm-yy' } )

强制返回表单的日期格式为" dd-mm-yyyy"。

此修复的唯一缺点是,通过日期选择器选择日期后,表单上显示的日期不会针对美国观众进行格式化(例如" 23-09-2014"而不是&# 34; 2014年9月23日&#34)。但在其他所有观看次数中,我都可以通过strftime转换显示美国格式。这是我为了简单而愿意做出的牺牲。至少在我没有更大的鱼来煎炸之前。

更新:这真的是一个糟糕的解决方案。'

在搜索了任何人的好处之后,我遇到了this post,这样可以更好地使用带有美国日期格式的datepicker。它有它的缺点(请参阅我对帖子的评论),但是可以用于我的目的。