Module | ActionView::Helpers::CaptureHelper |
In: |
vendor/rails/actionpack/lib/action_view/helpers/capture_helper.rb
|
Capture lets you extract parts of code into instance variables which can be used in other points of the template or even layout file.
<% @script = capture do %> [some html...] <% end %>
content_for("name") is a wrapper for capture which will store the fragment in a instance variable similar to @content_for_layout.
layout.rhtml:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>layout with js</title> <script type="text/javascript"> <%= @content_for_script %> </script> </head> <body> <%= @content_for_layout %> </body> </html>
view.rhtml
This page shows an alert box! <% content_for("script") do %> alert('hello world') <% end %> Normal view text
Capture allows you to extract a part of the template into an instance variable. You can use this instance variable anywhere in your templates and even in your layout.
Example of capture being used in a .rhtml page:
<% @greeting = capture do %> Welcome To my shiny new web page! <% end %>
Example of capture being used in a .rxml page:
@greeting = capture do 'Welcome To my shiny new web page!' end
# File vendor/rails/actionpack/lib/action_view/helpers/capture_helper.rb, line 57 57: def capture(*args, &block) 58: # execute the block 59: begin 60: buffer = eval("_erbout", block.binding) 61: rescue 62: buffer = nil 63: end 64: 65: if buffer.nil? 66: capture_block(*args, &block) 67: else 68: capture_erb_with_buffer(buffer, *args, &block) 69: end 70: end
Content_for will store the given block in an instance variable for later use in another template or in the layout.
The name of the instance variable is content_for_<name> to stay consistent with @content_for_layout which is used by ActionView’s layouts
Example:
<% content_for("header") do %> alert('hello world') <% end %>
You can use @content_for_header anywhere in your templates.
NOTE: Beware that content_for is ignored in caches. So you shouldn’t use it for elements that are going to be fragment cached.
# File vendor/rails/actionpack/lib/action_view/helpers/capture_helper.rb, line 90 90: def content_for(name, &block) 91: eval "@content_for_#{name} = (@content_for_#{name} || '') + capture(&block)" 92: end