2017-04-24 34 views
0

我想了解Rails控制器的以下方法紅寶石產量Rails的控制器變量

def self.collect_with_max_id(collection=[], max_id=nil, &block) 
     response = yield(max_id) 
     collection += response 
     response.empty? ? collection.flatten : collect_with_max_id(collection, response.last.id - 1, &block) 
    end 

當試圖調試與byebug方法我得到了所有的對象收集和max_id值: 我停留在這部分

response = yield(max_id) 

雖然是552860227390144512一個max_id,調用響應變量時,我只是得到一個空數組[],它似乎打破整個方法。

有人可以解釋yield函數在這種情況下。我現在只是從ror中渲染視圖和塊。

回答

0

yield是ruby中的一個關鍵字,它用於執行給定的方法。

def foo 
    yield 'Hi 1' 
    yield 'Hi 2' 
end 

foo { |string| puts string } 

# Hi 1 
# Hi 2 

在你的情況,塊也採取了一個變量&block所以你可以做一個遞歸:

def bar(i = 1, &block) 
    return if i <= 0 

    yield(i) # or you can do block.call(i) 

    bar(i - 1, &block) 
end 

bar(3) { |i| puts "I am called with #{i}" } 

的方法停止,因爲最後一行的遞歸。你問是否response.empty?,如果它是你會回到collection.flatten

的TL &博士忘記軌的幾個月,學習Ruby語言,否則你會在受傷的世界。