"блок не указан" ошибки с cache_money - PullRequest
0 голосов
/ 29 мая 2010

Я унаследовал сайт, который на производстве генерирует десятки исключений «без блока» каждые 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 Ответ

2 голосов
/ 29 мая 2010

строка 33 вызывает add, но не пропускает блок, хотя ожидается его в строке 42, и нет проверки block_given?, как в методе get. Кажется, в данном случае не существует подходящего блока для передачи, так как блок, переданный в get, уже получен в вызове add в строке 33, поэтому, вероятно, его повторная передача по отдельности в add неправильно.

Изменение строки 42 на yield if block_given? должно исправить вашу ошибку в этом случае и не должно вызывать проблем в других местах.

Стоит также отметить, что строка 42 вызывается только в том случае, если что-то не было сохранено, поэтому вы можете посмотреть, почему это происходит.

...