我在我的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
我从哪里开始排查故障?
答案 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。它有它的缺点(请参阅我对帖子的评论),但是可以用于我的目的。