2010-05-29 4 views
0

J'ai hérité d'un site qui en production génère des dizaines d'exceptions "aucun bloc donné" toutes les 5 minutes.erreurs "no block given" avec cache_money

haut de la trace de la pile est:

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' 

il semble donc que le problème est dans le plug-in d'argent de cache.

Quelqu'un a-t-il déjà expérimenté quelque chose de similaire? J'ai coupé et collé le code approprié ci-dessous - quelqu'un de plus familier avec des blocs capables de discerner des problèmes évidents?

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 

Répondre

2

ligne 33 appelle add, mais pas le passage d'un bloc, si l'on devrait en ligne 42 et il n'y a pas de contrôle block_given? comme il est dans la méthode get. Il ne semble pas vraiment y avoir de bloc approprié à passer dans ce cas, car le bloc passé à get est déjà cédé à l'appel add sur la ligne 33, donc le passer à nouveau séparément à add n'est probablement pas correct.

Modifier la ligne 42 à yield if block_given? devrait corriger votre erreur dans ce cas et ne devrait pas causer de problèmes ailleurs.

Il est également important de noter que la ligne 42 n'est appelée que si quelque chose n'a pas été stockée, vous pouvez donc vouloir voir pourquoi cela se produit.