2015-12-21 75 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'中实现转换为美分逻辑,也可以实现'优惠券'的自定义设置。