簡體   English   中英

神秘的Ruby Block行為:&block vs. {block.call}

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM