Module: ActionView::Helpers::CaptureHelper
- Included in:
- ActionView::Helpers
- Defined in:
- lib/action_view/helpers/capture_helper.rb
Overview
CaptureHelper exposes methods to let you extract generated markup which can be used in other parts of a template or layout file. It provides a method to capture blocks into variables through capture and a way to capture a block of markup for use in a layout through content_for.
Instance Method Summary collapse
-
#capture(*args, &block) ⇒ Object
The capture method allows you to extract part of a template into a variable.
-
#content_for(name, content = nil, &block) ⇒ Object
Calling content_for stores a block of markup in an identifier for later use.
-
#with_output_buffer(buf = '') ⇒ Object
Use an alternate output buffer for the duration of the block.
Instance Method Details
#capture(*args, &block) ⇒ Object
The capture method allows you to extract part of a template into a variable. You can then use this variable anywhere in your templates or layout.
Examples
The capture method can be used in ERb templates...
<% @greeting = capture do %>
Welcome to my shiny new web page! The date and time is
<%= Time.now %>
<% end %>
...and Builder (RXML) templates.
@timestamp = capture do
"The current timestamp is #{Time.now}."
end
You can then use that variable anywhere else. For example:
33 34 35 36 37 38 39 40 41 |
# File 'lib/action_view/helpers/capture_helper.rb', line 33 def capture(*args, &block) # Return captured buffer in erb. if block_called_from_erb?(block) with_output_buffer { block.call(*args) } else # Return block result otherwise, but protect buffer also. with_output_buffer { return block.call(*args) } end end |
#content_for(name, content = nil, &block) ⇒ Object
Calling content_for stores a block of markup in an identifier for later use. You can make subsequent calls to the stored content in other templates or the layout by passing the identifier as an argument to yield.
Examples
<% content_for :not_authorized do %>
alert('You are not authorized to do that!')
<% end %>
You can then use yield :not_authorized anywhere in your templates.
<%= yield :not_authorized if current_user.nil? %>
You can also use this syntax alongside an existing call to yield in a layout. For example:
<%# This is the layout %>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>My Website</title>
<%= yield :script %>
</head>
<body>
<%= yield %>
</body>
</html>
And now, we'll create a view that has a content_for call that creates the script identifier.
<%# This is our view %>
Please login!
<% content_for :script do %>
<script type="text/javascript">alert('You are not authorized to view this page!')</script>
<% end %>
Then, in another view, you could to do something like this:
<%= link_to_remote 'Logout', :action => 'logout' %>
<% content_for :script do %>
<%= javascript_include_tag :defaults %>
<% end %>
That will place
Use an alternate output buffer for the duration of the block. Defaults to a new empty string.
127 128 129 130 131 132 133 |
# File 'lib/action_view/helpers/capture_helper.rb', line 127 def with_output_buffer(buf = '') #:nodoc: self.output_buffer, old_buffer = buf, output_buffer yield output_buffer ensure self.output_buffer = old_buffer end |