cache_money中的“no block given”错误

时间:2010-05-29 17:01:24

标签: ruby-on-rails ruby exception cache-money

我继承了一个网站,该网站在生产过程中每5分钟产生几十个“无阻塞”异常。

堆栈跟踪的顶部是:

   vendor/gems/nkallen-cache-money-0.2.5/lib/cash/accessor.rb:42:in `add'
   vendor/gems/nkallen-cache-money-0.2.5/lib/cash/accessor.rb:33:in `get'
   vendor/gems/nkallen-cache-money-0.2.5/lib/cash/accessor.rb:22:in `call'
   vendor/gems/nkallen-cache-money-0.2.5/lib/cash/accessor.rb:22:in `fetch'
   vendor/gems/nkallen-cache-money-0.2.5/lib/cash/accessor.rb:31:in `get'

因此问题出现在缓存钱插件中。

有没有人经历过类似的事情?

我已经剪切并粘贴了下面的相关代码 - 谁更熟悉能够识别任何明显问题的块?

 11       def fetch(keys, options = {}, &block)
 12         case keys
 13         when Array
 14           keys = keys.collect { |key| cache_key(key) }
 15           hits = repository.get_multi(keys)
 16           if (missed_keys = keys - hits.keys).any?
 17             missed_values = block.call(missed_keys)
 18             hits.merge!(missed_keys.zip(Array(missed_values)).to_hash)
 19           end
 20           hits
 21         else
 22           repository.get(cache_key(keys), options[:raw]) || (block ? block.call : nil)
 23         end
 24       end
 25 
 26       def get(keys, options = {}, &block)
 27         case keys
 28         when Array
 29           fetch(keys, options, &block)
 30         else
 31           fetch(keys, options) do
 32             if block_given?
 33               add(keys, result = yield(keys), options)
 34               result
 35             end
 36           end
 37         end
 38       end
 39 
 40       def add(key, value, options = {})
 41         if repository.add(cache_key(key), value, options[:ttl] || 0, options[:raw]) == "NOT_STORED\r\n"
 42           yield
 43         end
 44       end

1 个答案:

答案 0 :(得分:2)

第33行正在调用add,但没有传递一个块,虽然第42行需要一个,并且block_given?方法中没有get检查。在这种情况下似乎没有合适的块传递,因为传递给get的块已经在第33行的add调用中得到了,所以再次将它再次传递给{ {1}}可能不正确。

将第42行更改为add应修复此案例中的错误,并且不应在其他地方造成问题。

值得注意的是,如果没有存储某些内容,则仅调用第42行,因此您可能需要查看为什么会发生这种情况。