aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2006-10-23 22:57:59 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2006-10-23 22:57:59 +0000
commit6c062054cdb236fead5d09679985ebb70d8b053a (patch)
treefc50fc2b66a928c89f1e009b060952d459546a58
parent9c9443812f1274667cea14edd387c6124205ac1c (diff)
downloadrails-6c062054cdb236fead5d09679985ebb70d8b053a.tar.gz
rails-6c062054cdb236fead5d09679985ebb70d8b053a.tar.bz2
rails-6c062054cdb236fead5d09679985ebb70d8b053a.zip
Added block-usage to TagHelper#content_tag [DHH]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5344 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r--actionpack/CHANGELOG9
-rw-r--r--actionpack/lib/action_view/helpers/tag_helper.rb28
-rw-r--r--actionpack/test/template/tag_helper_test.rb17
3 files changed, 47 insertions, 7 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG
index ddc2cd585a..8d391fc169 100644
--- a/actionpack/CHANGELOG
+++ b/actionpack/CHANGELOG
@@ -1,5 +1,14 @@
*SVN*
+* Added block-usage to TagHelper#content_tag [DHH]. Example:
+
+ <% content_tag :div, :class => "strong" %>
+ Hello world!
+ <% end %>
+
+ Will output:
+ <div class="strong"><p>Hello world!</p></div>
+
* Deprecated UrlHelper#link_to_image and UrlHelper#link_to :post => true #6409 [BobSilva]
* Upgraded NumberHelper with number_to_phone support international formats to comply with ITU E.123 by supporting area codes with less than 3 digits, added precision argument to number_to_human_size (defaults to 1) #6421 [BobSilva]
diff --git a/actionpack/lib/action_view/helpers/tag_helper.rb b/actionpack/lib/action_view/helpers/tag_helper.rb
index f913c99abb..8b8c7b491c 100644
--- a/actionpack/lib/action_view/helpers/tag_helper.rb
+++ b/actionpack/lib/action_view/helpers/tag_helper.rb
@@ -15,11 +15,26 @@ module ActionView
end
# Examples:
- # * <tt>content_tag("p", "Hello world!") => <p>Hello world!</p></tt>
- # * <tt>content_tag("div", content_tag("p", "Hello world!"), "class" => "strong") => </tt>
+ # * <tt>content_tag(:p, "Hello world!") => <p>Hello world!</p></tt>
+ # * <tt>content_tag(:div, content_tag(:p, "Hello world!"), :class => "strong") => </tt>
# <tt><div class="strong"><p>Hello world!</p></div></tt>
- def content_tag(name, content, options = nil)
- "<#{name}#{tag_options(options.stringify_keys) if options}>#{content}</#{name}>"
+ #
+ # ERb example:
+ # <% content_tag :div, :class => "strong" %>
+ # Hello world!
+ # <% end %>
+ #
+ # Will output:
+ # <div class="strong"><p>Hello world!</p></div>
+ def content_tag(name, content_or_options_with_block = nil, options = nil, &block)
+ if block_given?
+ options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
+ content = capture(&block)
+ concat(content_tag_string(name, content, options), block.binding)
+ else
+ content = content_or_options_with_block
+ content_tag_string(name, content, options)
+ end
end
# Returns a CDATA section for the given +content+. CDATA sections
@@ -41,6 +56,11 @@ module ActionView
end
private
+ def content_tag_string(name, content, options)
+ tag_options = options ? tag_options(options.stringify_keys) : ""
+ "<#{name}#{tag_options}>#{content}</#{name}>"
+ end
+
def tag_options(options)
cleaned_options = convert_booleans(options.stringify_keys.reject {|key, value| value.nil?})
' ' + cleaned_options.map {|key, value| %(#{key}="#{escape_once(value)}")}.sort * ' ' unless cleaned_options.empty?
diff --git a/actionpack/test/template/tag_helper_test.rb b/actionpack/test/template/tag_helper_test.rb
index bda57c4e9b..0ebdf009c7 100644
--- a/actionpack/test/template/tag_helper_test.rb
+++ b/actionpack/test/template/tag_helper_test.rb
@@ -1,11 +1,10 @@
require File.dirname(__FILE__) + '/../abstract_unit'
-require File.dirname(__FILE__) + '/../../lib/action_view/helpers/tag_helper'
-require File.dirname(__FILE__) + '/../../lib/action_view/helpers/url_helper'
-
class TagHelperTest < Test::Unit::TestCase
include ActionView::Helpers::TagHelper
include ActionView::Helpers::UrlHelper
+ include ActionView::Helpers::TextHelper
+ include ActionView::Helpers::CaptureHelper
def test_tag
assert_equal "<p class=\"show\" />", tag("p", "class" => "show")
@@ -35,6 +34,18 @@ class TagHelperTest < Test::Unit::TestCase
content_tag("a", "Create", :href => "create")
end
+ def test_content_tag_with_block
+ _erbout = ''
+ content_tag(:div) { _erbout.concat "Hello world!" }
+ assert_dom_equal "<div>Hello world!</div>", _erbout
+ end
+
+ def test_content_tag_with_block_and_options
+ _erbout = ''
+ content_tag(:div, :class => "green") { _erbout.concat "Hello world!" }
+ assert_dom_equal %(<div class="green">Hello world!</div>), _erbout
+ end
+
def test_cdata_section
assert_equal "<![CDATA[<hello world>]]>", cdata_section("<hello world>")
end