2015-12-21 86 views
2

我有一個模型,它有一個名爲value的屬性,這個屬性保存在db中作爲integerRails將浮點值字符串轉換爲整數

我輸入使用text_field在視圖中的數目,我也執行該取值(像21.37)就可以了:before_save方法,並利用該money寶石它轉換成美分。

但是,似乎在我甚至可以執行將它從float轉換爲整數的方法之前,它將被轉換爲某種整數並且小數點正在丟失。

我已經通過輸出在運行before_save:方法value測試這一點,它圓它21

有誰知道爲什麼這可能發生,我不是在執行其他任何更改。

+0

在你的服務器日誌裏是'param [:value]'21.37或21?我想知道是否在Rails或Rack中發生舍入。 –

+0

通過日誌回顧我看到這 在2015-12-21 19:09:55 +0000開始POST「/ projects/1/coupons」爲127.0.0.1處理通過CouponsController#創建爲HTML 參數:{ 「value」=>「12.28」}所以看起來像它保持它作爲一個字符串最初我認爲它必須是一個Rails的東西 –

回答

0

我猜你在你的控制器做這樣的事情Coupon.new(params),由於導軌知道Couponvalue應該是一個整數,它有益調用蓋,果然21.37到21下的params[:value]to_i。下面是一個相當不雅,但有效的解決辦法:

params[:value] ~= /.*\.(\d+)/ 
params[:value] = params[:value].to_f * (10**$1.length) if $1 

做,你做Coupon.new(params)之前。

另一種方法是簡單地假定你不關心小數點後第二位(你是在處理分數)。那麼你可以簡單地做params[:value] = params[:value].to_f.round(2) * 100

另外,您應該考慮在您的視圖中使用number_field而不是text_field,這樣至少可以確保您獲得一個數字。類似number_field(:coupon, :value, step: 0.01)應確保您的用戶可以輸入小數。

+0

是的,我認爲這將是這樣的事情,不幸的是我永遠不知道如果該數字將有2小數位數 –

+0

我爲此增加了一個解決方案。 –

0

我同意@kitkat似乎會發生在模型層的東西。您可以在'before_validation'中實現轉換爲美分邏輯,也可以實現'優惠券'的自定義設置。