错误:无法强制进入Fixnum

我有以下函数来汇总给定用户的Pack模型中的:amount字段的所有记录:

user.rb

  def total_money_spent_cents amount = self.packs.map(&:amount).sum return amount end 

但是,当我使用此function时,我收到以下错误:

 nil can't be coerced into Fixnum 

有什么建议?

编辑我在测试中仍然遇到有关Fixnum的问题,并在这里打开另一个问题。

这表明你的一个包有一个尚未设置的金额字段,所以是nil 。 当你尝试将它添加到其他东西时,它会经历类型强制,看看Ruby是否可以按下它的类型可以添加到数字中,但它不能,所以你有这个错误。

一个解决方案是:

 def total_amount_spent_cents packs.map(&:amount).compact.sum end 

Array#compact删除了nil元素。

这可能是修复症状而不是实际问题。 可能是你根本不应该有nil的情况,在这种情况下你应该检查你的Pack模型的初始化(或者可能是它的validation,以确保amount是强制性的)。

为了这种事情,我在Array和Hash中添加了一些额外的方法:它们就像是compact但是它们删除所有返回true的值为blank? 而不只是nil:所以将删除空字符串,空数组,哈希等。

 class Hash def compact_blank! self.each{|k,v| self.delete(k) if v.blank? } self end def compact_blank self.dup.compact_blank! end end class Array def compact_blank! self.delete_if(&:blank?) end def compact_blank self.dup.compact_blank! end end 

用得像

 ["1", "abc", "", nil, []].compact_blank => ["1", "abc"] 

它对params特别有用,你可能会得到很多空字符串。