ruby 这一行怎么会抛出一个nil异常呢?

xxhby3vn  于 2023-05-28  发布在  Ruby
关注(0)|答案(1)|浏览(107)

我有一段代码,看起来像这样:

order_items_info.pluck(:quantity_shipped).sum.abs

我在日志中发现了这个错误:

Error reindexing order 123456 - NoMethodError - undefined method `+' for nil:NilClass

      inject(:+) || 0
      ^^^^^^

我找不到任何方法来重现这个错误。order_items_info是一个哈希数组,但这并不重要。以下是我尝试过的:

Loading production environment (Rails 6.1.7)
irb(main):001:0> order_items_info = nil
=> nil
irb(main):002:0> order_items_info.pluck(:quantity_shipped).sum.abs
(irb):2:in `<main>': undefined method `pluck' for nil:NilClass (NoMethodError)
irb(main):003:0> order_items_info = []
=> []
irb(main):004:0> order_items_info.pluck(:quantity_shipped).sum.abs
=> 0
irb(main):005:0> order_items_info = [{quantity_shipped: nil}]
=> [{:quantity_shipped=>nil}]
irb(main):006:0> order_items_info.pluck(:quantity_shipped).sum.abs
=> 0
irb(main):007:0> order_items_info = [nil]
=> [nil]
irb(main):008:0> order_items_info.pluck(:quantity_shipped).sum.abs
/home/deploy/zonmaster/shared/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.7/lib/active_support/core_ext/enumerable.rb:157:in `block in pluck': undefined method `[]' for nil:NilClass (NoMethodError)

      map { |element| element[key] }
                             ^^^^^
irb(main):009:0> order_items_info = [{quantity_shipped: 'abd'}]
=> [{:quantity_shipped=>"abd"}]
irb(main):010:0> order_items_info.pluck(:quantity_shipped).sum.abs
(irb):10:in `<main>': undefined method `abs' for "abd":String (NoMethodError)

但是没有一个在inject上给予我错误。

vaqhlq81

vaqhlq811#

pluck在这里是一个Enumerable方法。https://apidock.com/rails/Enumerable/pluck
在您的示例中,您的数据键是字符串,但您通过符号提取它,然后它返回nil而不是value。

7.8 :017 > [{"qty"=>1},{"qty"=>1}].pluck(:qty)
=> [nil, nil]
2.7.8 :018 > [{"qty"=>1},{"qty"=>1}].pluck(:qty).sum
Traceback (most recent call last):
        1: from (irb):18
NoMethodError (undefined method `+' for nil:NilClass)

你需要使用string key:"qty"

2.7.8 :023 > [{"qty"=>1},{"qty"=>1}].pluck("qty")
 => [1, 1]
2.7.8 :024 > [{"qty"=>1},{"qty"=>1}].pluck("qty").sum
 => 2
2.7.8 :025 > [{"qty"=>1},{"qty"=>1}].pluck("qty").sum.abs
 => 2

相关问题