2010-05-29 3 views
0

5 분마다 수십개의 "블록 차단"예외가 생성되는 사이트를 상속했습니다. 스택 추적의cache_money에서 "no block given"오류가 발생했습니다.

상단은 다음과 같습니다

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' 

가 그래서 문제가 캐시 돈 플러그인에 나타납니다.

비슷한 경험을 한 사람이 누구입니까?

아래의 관련 코드를 잘라내어 붙여 넣었습니다. 명백한 문제를 식별 할 수있는 블록에 익숙한 사람은 누구입니까? 하나는 라인 (42)에 기대하고있다 get 방법처럼 더 block_given? 검사 없다되지만

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 

답변

2

라인 (33)은 블록을 통과 add 호출되지 않지만. 이 경우에는 적절한 블록이 실제로 보이지 않습니다. get에 전달 된 블록이 이미 add 호출에서 33 번 라인으로 전달되었으므로 add에 다시 전달하는 것이 맞지 않을 수 있습니다.

이 경우 42 행에서 yield if block_given?으로 변경하면 오류가 수정되어 다른 곳에서 문제가 발생하지 않아야합니다.

뭔가가 저장되지 않은 경우에만 42 번 라인이 호출되므로 주목해야 할 점이 있습니다.

관련 문제