错误:无法强制进入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特别有用,你可能会得到很多空字符串。