0

我在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" 

我認爲一些日期選擇保存正確的規則排除了格式問題。我很難理解這會如何發生。在08/13/2014之前的任何日期都有效,並且之後的任何日期都會返回超出範圍的錯誤。

這裏是醜陋的細節:

的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 

工作。 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 

我該從哪裏出發t解決這個問題?

+0

日期格式問題?它是否假設爲dd/mm/yy?你有沒有試過20/08/14,這是考慮範圍? – SteveTurczyn 2014-08-29 21:11:06

+0

我剛剛在手動輸入日期而不是通過日期選擇器來挑選日期。如果我輸入日期「20140828」,它在範圍內。 「20140807」也是如此。仍然不明白它是如何通過datepicker錯誤的。 – digijim 2014-08-29 21:13:39

+0

它變得更加怪異。從datepicker工作中選擇的2014年9月開始的日期也可以。所以只是從2014年8月13日到2014年8月31日的日期失敗。我嘗試過的所有其他日期都有效。我需要一杯飲料。 – digijim 2014-08-29 21:40:04

回答

1

bootstrap-datepicker-rails返回的日期的默認格式是「mm-dd-yyyy」。以這種方式提交格式化的日期不正確地保存日期​​,或者導致「超出範圍」錯誤,因爲Rails將當天誤解爲月份。 h/t給@SteveTurczyn打開我的眼睛,看看這個事實。

@AndrewMorton建議讓bootstrap-datepicker-rails提交一個Date而不是String,但是沒有這樣的機制內置到那個gem中,AFAIK。

所以我需要改變由datepicker返回的字符串的格式。經過一些控制檯測試後,我發現「dd-mm-yyyy」格式可以成功保存(當然還有其他格式)。

更改此行(來自jobs.js。咖啡):

$('.datepicker').datepicker() 

...這樣的:

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

迫使日回到了形式在 「DD-MM-YYYY」 的格式。

此修復程序唯一的缺點是,通過日期選擇器選擇日期後,表格上顯示的日期未格式化爲美國受衆(例如「23-09-2014」而不是「09-23-2014」 「)。但在所有其他視圖中,我可以通過strftime轉換顯示美國格式。這是我爲了簡單而願意做出的犧牲。至少在我沒有更大的魚來炒。

更新:這真是一個糟糕的'解決方案'。

經過太多搜索任何人的好,我遇到了this post這使用datepicker美國日期格式更好的工作。它有缺點(請參閱我對該帖子的評論),但會爲我的目的工作。