我有一个名为value
的属性的模型,它作为integer
保存在数据库中。
我使用text_field
在视图中输入数字,我也在其:before_save
上执行一个方法,该方法获取值(类似于21.37)并使用money
gem转换它只是美分。
然而,似乎在我甚至可以执行将其从float转换为整数的方法之前,它正被转换为某种整数并且小数正在丢失。
我通过在运行value
的方法中输出before_save:
并将其四舍五入到21
有谁知道为什么会发生这种情况,我没有对它进行任何其他更改。
答案 0 :(得分:0)
我猜你在你的控制器中正在做类似Coupon.new(params)
的事情,因为Rails知道Coupon
的{{1}}应该是一个整数,它有助于调用{{1}在value
为你提供封面,将21.37变成21。这是一个相当不优雅但有效的解决方案:
to_i
在params[:value]
之前执行此操作。
另一种选择是简单地假设你不关心小数点后第二位的任何东西(毕竟你要处理的是美分)。然后你可以简单地做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
之类的东西应该确保您的用户可以输入小数。
答案 1 :(得分:0)
我同意@kitkat似乎会在模型层中发生。您可能可以在“before_validation'之前实现转换为美分逻辑”。或者也许是优惠券的定制设定者。