错误:无法强制进入Fixnum

时间:2014-06-05 11:14:26

标签: ruby-on-rails ruby model sum

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

user.rb

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

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

nil can't be coerced into Fixnum

有什么建议吗?

修改 我在测试中仍然遇到有关Fixnum的问题,还有另一个问题打开here

2 个答案:

答案 0 :(得分:9)

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

一个解决方案就是:

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

Array#compact删除了nil元素。

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

答案 1 :(得分:0)

我为Array和Hash添加了一些额外的方法:它们就像compact但它们删除了blank?返回true的所有值,而不仅仅是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,你可能会获得很多空字符串。