[英]Mysterious Ruby Block behavior: &block vs. {block.call}
當編寫一個幫助打印可以從其他助手和視圖中使用的javascript時,我偶然發現了以下問題:
def javascript(print_tag = false, &block)
content_for(:javascript) do
if print_tag
javascript_tag(&block) # does not work
javascript_tag { block.call } # does work
else
capture(&block)
end
end
end
應該使用javascript { "alert('hurray'); }
來調用此幫助程序。
在第一個替代方案 - 我期望工作 - Rails javascript_tag幫助器呈現一個空的<script type="text/javascript"> //<![CDATA[ //]]> </script>
標記。
然而,第二種選擇按預期工作。
那里發生了什么? 怎么會有所不同?
你說你在觀點上這樣做,對嗎?
<%= javascript { "alert('hurray');" } %>
但是content_tag(&block)
工作,你應該以在視圖中使用content_tag
的方式調用javascript
,這是:
<% javascript do %>
alert('hurray');
<% end %>
content_tag
的行為根據調用的位置而有所不同,請參閱函數block_called_from_erb?
在源代碼中。 在第一種情況下,這個函數返回true
因為塊確實來自erb(然后它是concat
,你不需要!),在第二種情況下返回false
(你從頭開始重新創建塊)和content_tag
返回字符串內容,這是你想要的。
# ./action_view/helpers/javascript_helper.rb
tag = content_tag(:script, javascript_cdata_section(content), html_options.merge(:type => Mime::JS))
if block_called_from_erb?(block)
concat(tag)
else
tag
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.