2014-04-12 33 views
1

找遍了互聯網,但無法找到任何答案,我的問題..修改表單字段之前它得到PARAMS(軌道4)

我有形式,即用戶可以輸入的時間在下面的格式 - HH:MM:SS或MM:SS或秒。讓我們稱這個模型爲LapResult,場名爲lap_time。 我需要對這些數據進行計算,所以我需要以秒爲單位保持它在數據庫中的整數。例如計算所有圈數的總時間,或計算兩個競爭者之間的差異。

我已經試過兩種解決方案:在DB

1)lap_time列是整數。但是經過一段時間的模型,由於數據類型是整數,輸入自動轉換。例如,如果我輸入11:56 - 它將在模型實例中爲11。
params[:lap_result][:lap_time] = 11:56 lap_result = LapResult.new(lap_result_params)

現在,如果我叫before_save before_validation或其它回調,我將與11號操作,因爲race_result.lap_time現在是11.我想它會自動被改變,因爲列的數據類型是整數。

2)我也試圖在傳遞到新的LapResult模型之前更改params(或者params的複製變量)。此方法適用於我正在查找的內容 - 時間已成功轉換爲整數,但後來遇到另一個問題。
如果用戶輸入由於某種原因未通過驗證,當頁面重新加載時,參數不會傳輸到表單,並且用戶必須再次輸入所有數據。這是問題,因爲有時可以有多達20圈的比賽..

目前,我通過更改數據類型爲字符串來解決此問題,但我覺得這樣做是不好的做法,因爲DB中的數據應該始終是一個整數類型。並且因爲在其他模型中相同的數據在DB中具有整數類型。對於慣例而言,配置原則並不是一個好主意。

來自rails guru的任何建議? 在此先感謝。

-
獎金的問題!如果表單未通過驗證並且頁面會重新載入所有數據,那麼肯定會在幾秒鐘內顯示。任何方式再次將其轉換爲MM:SS格式。我想用javascript做這種工作更容易。有任何想法嗎?
ps:使用total_laps.times {lap_results.build}創建的多個表單,因爲它是嵌套模型的形式,所以我無法找到從params手動設置值的方法。

+0

_2)還我試圖改變PARAMS(或則params的複製變量)..._你通過做params哈希表的深層副本'克隆'之前修改它們?如果你保持完整的參數,表格應該把它們拿起來。 –

+0

不知道,不知道克隆方法。剛剛分配給新變量的參數,然後修改它 – vladra

回答

1

你可以嘗試重寫lap_time=方法

class LapResult  
    def lap_time=(value) 
    lap_time_in_seconds = # ... logic to convert value MM:TT to integer 

    # set the value that will be saved to the database 
    self[:lap_time] = lap_time_in_seconds 
    end 
end 
+0

非常感謝,那就是我一直在尋找! 正確地將時間字符串轉換爲秒數,並在驗證失敗和頁面重新加載的情況下重新顯示數據。 現在剩下的唯一事情就是當頁面由於驗證失敗而重新加載時,將整數轉換爲時間格式字符串。 你可以建議我可以在rails api中找到這個函數嗎? – vladra