Added .rxml (and any non-rhtml template, really) supportfor...

Added .rxml (and any non-rhtml template, really) supportfor CaptureHelper#content_for and CaptureHelper#capture #3287 [Brian Takita]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3669 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
上级 26eaf073
*SVN* *SVN*
* Added .rxml (and any non-rhtml template, really) supportfor CaptureHelper#content_for and CaptureHelper#capture #3287 [Brian Takita]
* Added script.aculo.us drag and drop helpers to RJS [Thomas Fuchs]. Examples: * Added script.aculo.us drag and drop helpers to RJS [Thomas Fuchs]. Examples:
page.draggable 'product-1' page.draggable 'product-1'
......
...@@ -43,24 +43,30 @@ module CaptureHelper ...@@ -43,24 +43,30 @@ module CaptureHelper
# instance variable. You can use this instance variable anywhere # instance variable. You can use this instance variable anywhere
# in your templates and even in your layout. # in your templates and even in your layout.
# #
# Example: # Example of capture being used in a .rhtml page:
# #
# <% @greeting = capture do %> # <% @greeting = capture do %>
# Welcome To my shiny new web page! # Welcome To my shiny new web page!
# <% end %> # <% end %>
#
# Example of capture being used in a .rxml page:
#
# @greeting = capture do
# 'Welcome To my shiny new web page!'
# end
def capture(*args, &block) def capture(*args, &block)
# execute the block # execute the block
buffer = eval("_erbout", block.binding) begin
pos = buffer.length buffer = eval("_erbout", block.binding)
block.call(*args) rescue
buffer = nil
end
# extract the block if buffer.nil?
data = buffer[pos..-1] capture_block(*args, &block)
else
# replace it in the original with empty string capture_erb_with_buffer(buffer, *args, &block)
buffer[pos..-1] = '' end
data
end end
# Content_for will store the given block # Content_for will store the given block
...@@ -84,6 +90,37 @@ def capture(*args, &block) ...@@ -84,6 +90,37 @@ def capture(*args, &block)
def content_for(name, &block) def content_for(name, &block)
eval "@content_for_#{name} = (@content_for_#{name} || '') + capture(&block)" eval "@content_for_#{name} = (@content_for_#{name} || '') + capture(&block)"
end end
private
def capture_block(*args, &block)
block.call(*args)
end
def capture_erb(*args, &block)
buffer = eval("_erbout", block.binding)
capture_erb_with_buffer(buffer, *args, &block)
end
def capture_erb_with_buffer(buffer, *args, &block)
pos = buffer.length
block.call(*args)
# extract the block
data = buffer[pos..-1]
# replace it in the original with empty string
buffer[pos..-1] = ''
data
end
def erb_content_for(name, &block)
eval "@content_for_#{name} = (@content_for_#{name} || '') + capture_erb(&block)"
end
def block_content_for(name, &block)
eval "@content_for_#{name} = (@content_for_#{name} || '') + capture_block(&block)"
end
end end
end end
end end
...@@ -7,6 +7,18 @@ def self.controller_path; "test"; end ...@@ -7,6 +7,18 @@ def self.controller_path; "test"; end
def content_for def content_for
render :layout => "talk_from_action" render :layout => "talk_from_action"
end end
def erb_content_for
render :layout => "talk_from_action"
end
def block_content_for
render :layout => "talk_from_action"
end
def non_erb_block_content_for
render :layout => "talk_from_action"
end
def rescue_action(e) raise end def rescue_action(e) raise end
end end
...@@ -34,7 +46,22 @@ def test_simple_capture ...@@ -34,7 +46,22 @@ def test_simple_capture
def test_content_for def test_content_for
get :content_for get :content_for
assert_equal "<title>Putting stuff in the title!</title>\n\nGreat stuff!", @response.body assert_equal expected_content_for_output, @response.body
end
def test_erb_content_for
get :content_for
assert_equal expected_content_for_output, @response.body
end
def test_block_content_for
get :block_content_for
assert_equal expected_content_for_output, @response.body
end
def test_non_erb_block_content_for
get :non_erb_block_content_for
assert_equal expected_content_for_output, @response.body
end end
def test_update_element_with_capture def test_update_element_with_capture
...@@ -45,4 +72,9 @@ def test_update_element_with_capture ...@@ -45,4 +72,9 @@ def test_update_element_with_capture
@response.body.strip @response.body.strip
) )
end end
private
def expected_content_for_output
"<title>Putting stuff in the title!</title>\n\nGreat stuff!"
end
end end
<% block_content_for :title do 'Putting stuff in the title!' end %>
Great stuff!
\ No newline at end of file
<% erb_content_for :title do %>Putting stuff in the title!<% end %>
Great stuff!
\ No newline at end of file
content_for :title do
'Putting stuff in the title!'
end
xml << "\nGreat stuff!"
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册