提交 5ac0273c 编写于 作者: J José Valim

Merge pull request #4226 from grentis/content_for_with_flush

content_for with flush parameter
...@@ -110,7 +110,7 @@ def capture(*args) ...@@ -110,7 +110,7 @@ def capture(*args)
# That will place +script+ tags for your default set of JavaScript files on the page; # That will place +script+ tags for your default set of JavaScript files on the page;
# this technique is useful if you'll only be using these scripts in a few views. # this technique is useful if you'll only be using these scripts in a few views.
# #
# Note that content_for concatenates the blocks it is given for a particular # Note that content_for concatenates (default) the blocks it is given for a particular
# identifier in order. For example: # identifier in order. For example:
# #
# <% content_for :navigation do %> # <% content_for :navigation do %>
...@@ -127,16 +127,37 @@ def capture(*args) ...@@ -127,16 +127,37 @@ def capture(*args)
# #
# <ul><%= content_for :navigation %></ul> # <ul><%= content_for :navigation %></ul>
# #
# If the flush parameter is true content_for replaces the blocks it is given. For example:
#
# <% content_for :navigation do %>
# <li><%= link_to 'Home', :action => 'index' %></li>
# <% end %>
#
# <%# Add some other content, or use a different template: %>
#
# <% content_for :navigation, true do %>
# <li><%= link_to 'Login', :action => 'login' %></li>
# <% end %>
#
# Then, in another template or layout, this code would render only the last link:
#
# <ul><%= content_for :navigation %></ul>
#
# Lastly, simple content can be passed as a parameter: # Lastly, simple content can be passed as a parameter:
# #
# <% content_for :script, javascript_include_tag(:defaults) %> # <% content_for :script, javascript_include_tag(:defaults) %>
# #
# WARNING: content_for is ignored in caches. So you shouldn't use it # WARNING: content_for is ignored in caches. So you shouldn't use it
# for elements that will be fragment cached. # for elements that will be fragment cached.
def content_for(name, content = nil, &block) def content_for(name, content = nil, flush = false, &block)
if content || block_given? if content || block_given?
content = capture(&block) if block_given? if block_given?
@view_flow.append(name, content) if content flush = content if content
content = capture(&block)
end
if content
flush ? @view_flow.set(name, content) : @view_flow.append(name, content)
end
nil nil
else else
@view_flow.get(name) @view_flow.get(name)
......
...@@ -53,6 +53,13 @@ def test_content_for_with_multiple_calls ...@@ -53,6 +53,13 @@ def test_content_for_with_multiple_calls
assert_equal 'foobar', content_for(:title) assert_equal 'foobar', content_for(:title)
end end
def test_content_for_with_multiple_calls_and_flush
assert ! content_for?(:title)
content_for :title, 'foo'
content_for :title, 'bar', true
assert_equal 'bar', content_for(:title)
end
def test_content_for_with_block def test_content_for_with_block
assert ! content_for?(:title) assert ! content_for?(:title)
content_for :title do content_for :title do
...@@ -63,6 +70,39 @@ def test_content_for_with_block ...@@ -63,6 +70,39 @@ def test_content_for_with_block
assert_equal 'foobar', content_for(:title) assert_equal 'foobar', content_for(:title)
end end
def test_content_for_with_block_and_multiple_calls_with_flush
assert ! content_for?(:title)
content_for :title do
'foo'
end
content_for :title, true do
'bar'
end
assert_equal 'bar', content_for(:title)
end
def test_content_for_with_block_and_multiple_calls_with_flush_nil_content
assert ! content_for?(:title)
content_for :title do
'foo'
end
content_for :title, nil, true do
'bar'
end
assert_equal 'bar', content_for(:title)
end
def test_content_for_with_block_and_multiple_calls_without_flush
assert ! content_for?(:title)
content_for :title do
'foo'
end
content_for :title, false do
'bar'
end
assert_equal 'foobar', content_for(:title)
end
def test_content_for_with_whitespace_block def test_content_for_with_whitespace_block
assert ! content_for?(:title) assert ! content_for?(:title)
content_for :title, 'foo' content_for :title, 'foo'
...@@ -74,12 +114,27 @@ def test_content_for_with_whitespace_block ...@@ -74,12 +114,27 @@ def test_content_for_with_whitespace_block
assert_equal 'foobar', content_for(:title) assert_equal 'foobar', content_for(:title)
end end
def test_content_for_with_whitespace_block_and_flush
assert ! content_for?(:title)
content_for :title, 'foo'
content_for :title, true do
output_buffer << " \n "
nil
end
content_for :title, 'bar', true
assert_equal 'bar', content_for(:title)
end
def test_content_for_returns_nil_when_writing def test_content_for_returns_nil_when_writing
assert ! content_for?(:title) assert ! content_for?(:title)
assert_equal nil, content_for(:title, 'foo') assert_equal nil, content_for(:title, 'foo')
assert_equal nil, content_for(:title) { output_buffer << 'bar'; nil } assert_equal nil, content_for(:title) { output_buffer << 'bar'; nil }
assert_equal nil, content_for(:title) { output_buffer << " \n "; nil } assert_equal nil, content_for(:title) { output_buffer << " \n "; nil }
assert_equal 'foobar', content_for(:title) assert_equal 'foobar', content_for(:title)
assert_equal nil, content_for(:title, 'foo', true)
assert_equal nil, content_for(:title, true) { output_buffer << 'bar'; nil }
assert_equal nil, content_for(:title, true) { output_buffer << " \n "; nil }
assert_equal 'bar', content_for(:title)
end end
def test_content_for_question_mark def test_content_for_question_mark
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册