aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_view/helpers/capture_helper.rb
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2006-02-26 19:47:50 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2006-02-26 19:47:50 +0000
commit3d1b51b4411ffe8de92d997b824637f9eaf47bb1 (patch)
tree2bdc1efce7f43615960f4b2ba2f2277c7395cd3d /actionpack/lib/action_view/helpers/capture_helper.rb
parent26eaf073c4de8276663f927fdeeb91453e8b3956 (diff)
downloadrails-3d1b51b4411ffe8de92d997b824637f9eaf47bb1.tar.gz
rails-3d1b51b4411ffe8de92d997b824637f9eaf47bb1.tar.bz2
rails-3d1b51b4411ffe8de92d997b824637f9eaf47bb1.zip
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
Diffstat (limited to 'actionpack/lib/action_view/helpers/capture_helper.rb')
-rw-r--r--actionpack/lib/action_view/helpers/capture_helper.rb61
1 files changed, 49 insertions, 12 deletions
diff --git a/actionpack/lib/action_view/helpers/capture_helper.rb b/actionpack/lib/action_view/helpers/capture_helper.rb
index 5c1f32a96c..9828fe0fa2 100644
--- a/actionpack/lib/action_view/helpers/capture_helper.rb
+++ b/actionpack/lib/action_view/helpers/capture_helper.rb
@@ -43,24 +43,30 @@ module ActionView
# instance variable. You can use this instance variable anywhere
# in your templates and even in your layout.
#
- # Example:
+ # Example of capture being used in a .rhtml page:
#
# <% @greeting = capture do %>
# 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)
# execute the block
- buffer = eval("_erbout", block.binding)
- pos = buffer.length
- block.call(*args)
+ begin
+ buffer = eval("_erbout", block.binding)
+ rescue
+ buffer = nil
+ end
- # extract the block
- data = buffer[pos..-1]
-
- # replace it in the original with empty string
- buffer[pos..-1] = ''
-
- data
+ if buffer.nil?
+ capture_block(*args, &block)
+ else
+ capture_erb_with_buffer(buffer, *args, &block)
+ end
end
# Content_for will store the given block
@@ -84,6 +90,37 @@ module ActionView
def content_for(name, &block)
eval "@content_for_#{name} = (@content_for_#{name} || '') + capture(&block)"
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