2017-03-27 38 views
0

docsconcat展望利益,有人給出瞭如何使用下面這一個例子:什麼是使用`capture`和`concat`的不僅僅是直接在Rails的渲染塊

def block_to_partial(partial_name, options = {}, &block) 
    options.merge!(:body => capture(&block)) 
    concat(render(:partial => partial_name, :locals => options), block.binding) 
end 

但難道你沒有concat這麼做嗎?它可以只與render一起工作嗎?

+1

如果您在Rails應用程序使用HAML時需要編寫視圖幫助程序,那麼您將需要'concat',因爲它是ERB的內核。無論如何,這是我的經驗。 –

回答

1

render只是呈現模板 - concat將它寫入響應中使用的輸出緩衝區。

注意到這個ERB例如:

<% render partial: 'foo/bar' %> 

由於我們使用<% %>的Ruby代碼的輸出只是評價。沒有什麼是實際輸出。

<%= render partial: 'foo/bar' %> 

而且

<% concat(render(partial: 'foo/bar')) %> 

都將部分的內容添加到響應主體。

使用concat的真正好處是當您創建應直接寫入緩衝區的輔助方法時。

capture另一方面用於將塊(HTML塊)的輸出保存到變量中,以便它可以在視圖中的其他位置使用。

+0

請注意,API Dock不是官方的rails文檔,通常很糟糕。我發現它比官方文檔有更好的谷歌排名非常令人討厭。 – max

+0

我不能使用收益而不是捕獲? – stackjlei

+0

^他們完全不同的事情。 'yield'輸出佈局的一部分或者用'content_for'獲取的內容。這裏的區別在於,你可以用'capture'作爲變量傳遞內容,如果你正在創建一個可以轉換或增加HTML的幫助器,它就會非常有用。 – max

相關問題