Module: ActionView::Helpers::CaptureHelper
- Defined in:
- lib/action_view/helpers/capture_helper.rb
Overview
Capture lets you extract parts of code into instance variables which can be used in other points of the template or even layout file.
Capturing a block into an instance variable
<% @script = capture do %>
[some html...]
<% end %>
Add javascript to header using content_for
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
Instance Method Summary collapse
-
#capture(&block) ⇒ Object
Capture allows you to extract a part of the template into an instance variable.
-
#content_for(name, &block) ⇒ Object
Content_for will store the given block in an instance variable for later use in another template or in the layout.
Instance Method Details
#capture(&block) ⇒ Object
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:
<% @greeting = capture do %>
Welcome To my shiny new web page!
<% end %>
51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/action_view/helpers/capture_helper.rb', line 51 def capture(&block) # execute the block buffer = eval("_erbout", block.binding) pos = buffer.length block.call # extract the block data = buffer[pos..-1] # replace it in the original with empty string buffer[pos..-1] = '' data end |
#content_for(name, &block) ⇒ Object
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
81 82 83 84 85 86 |
# File 'lib/action_view/helpers/capture_helper.rb', line 81 def content_for(name, &block) base = controller.instance_variable_get(instance_var_name(name)) || "" data = capture(&block) controller.instance_variable_set(instance_var_name(name), base + data) data end |