diff --git a/actionpack/lib/action_view/helpers/javascript_helper.rb b/actionpack/lib/action_view/helpers/javascript_helper.rb index 51cbfb95d9..45a5791efe 100644 --- a/actionpack/lib/action_view/helpers/javascript_helper.rb +++ b/actionpack/lib/action_view/helpers/javascript_helper.rb @@ -156,7 +156,6 @@ module ActionView # javascript_tag "alert('All is good')" # # Returns: - # # # # +html_options+ may be a hash of attributes for the - def javascript_tag(content, html_options = {}) - content_tag("script", javascript_cdata_section(content), html_options.merge(:type => Mime::JS)) + # javascript_tag "alert('All is good')", :defer => 'defer' + # # => + # + # Instead of passing the content as an argument, you can also use a block + # in which case, you pass your +html_options+ as the first parameter. + # <% javascript_tag :defer => 'defer' do -%> + # alert('All is good') + # <% end -%> + def javascript_tag(content_or_options_with_block = nil, html_options = {}, &block) + if block_given? + html_options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash) + content = capture(&block) + else + content = content_or_options_with_block + end + + javascript_tag = content_tag("script", javascript_cdata_section(content), html_options.merge(:type => Mime::JS)) + + if block_given? && block_is_within_action_view?(block) + concat(javascript_tag, block.binding) + else + javascript_tag + end end def javascript_cdata_section(content) #:nodoc: @@ -186,6 +205,11 @@ module ActionView end js_option end + + private + def block_is_within_action_view?(block) + eval("defined? _erbout", block.binding) + end end JavascriptHelper = JavaScriptHelper unless const_defined? :JavascriptHelper diff --git a/actionpack/test/template/javascript_helper_test.rb b/actionpack/test/template/javascript_helper_test.rb index ce830494a7..ec6a02ba45 100644 --- a/actionpack/test/template/javascript_helper_test.rb +++ b/actionpack/test/template/javascript_helper_test.rb @@ -91,6 +91,18 @@ class JavaScriptHelperTest < Test::Unit::TestCase javascript_tag("alert('hello')", :id => "the_js_tag") end + def test_javascript_tag_with_block + _erbout = '' + javascript_tag { _erbout.concat "alert('hello')" } + assert_dom_equal "", _erbout + end + + def test_javascript_tag_with_block_and_options + _erbout = '' + javascript_tag(:id => "the_js_tag") { _erbout.concat "alert('hello')" } + assert_dom_equal "", _erbout + end + def test_javascript_cdata_section assert_dom_equal "\n//\n", javascript_cdata_section("alert('hello')") end diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index 81ca1da94f..212f7b179d 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Added block-acceptance to JavaScriptHelper#javascript_tag #7527 [BobSilva/tarmo/rmm5t] + * Fixed that altering join tables in migrations would fail w/ sqlite3 #7453 [TimoMihaljov/brandon] * Fix association writer with :dependent => :nullify. #7314 [Jonathan Viney]