4

他のヘルパーとビューの両方から使用できる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'); }

最初の選択肢(私が機能すると期待していた)では、Railsjavascript_tagヘルパーが空の<script type="text/javascript"> //<![CDATA[ //]]> </script>タグをレンダリングします。

ただし、2番目の選択肢は期待どおりに機能します。

そこで何が起こっているのですか?どうして違うの?

4

1 に答える 1

4

あなたはあなたがあなたの見解でこれをしていると言いますよね?

<%= javascript { "alert('hurray');" } %>

しかし、機能するためには、ビューで使用することを目的とした方法content_tag(&block)を呼び出す必要があります。これは次のとおりです。javascriptcontent_tag

<% javascript do %>
  alert('hurray');
<% end %>

content_tagの動作は、呼び出し元によって異なりblock_called_from_erb?ます。ソースコードの関数を参照してください。true最初のケースでは、ブロックがerbから来ているため(そして、edされているので、この関数は戻りconcatません!)、2番目の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
于 2010-12-20T14:49:04.337 に答える