The capture_erb plugin allows you to capture the content of a block in an ERB template, and return it as a value, instead of injecting the template block into the template output.
<% value = capture_erb do %> Some content here. <% end %>
capture_erb
can be used inside other methods that are called inside templates. It can be combined with the inject_erb plugin to wrap template blocks with arbitrary output and then inject the wrapped output into the template.
If the output buffer object responds to capture
and is not an instance of String (e.g. when erubi/capture_block
is being used as the template engine), this will call capture
on the output buffer object, instead of setting the output buffer object temporarily to a new object.
By default, capture_erb returns the value of the block, converted to a string. However, that can cause issues with code such as:
<% value = capture_erb do %> Some content here. <% if something %> Some more content here. <% end %> <% end %>
In this case, the block may return nil, instead of the content of the template. To handle this case, you can provide the returns: :buffer
option when calling the method (to handle that specific call, or when loading the plugin (to default to that behavior). Note that if the output buffer object responds to capture
and is not an instance of String, the returns: :buffer
behavior is the default and cannot be changed.
Classes and Modules
Public Class methods
Support returns: :buffer
to default to returning buffer object.
# File lib/roda/plugins/capture_erb.rb 49 def self.configure(app, opts=OPTS) 50 # RODA4: make returns: :buffer the default behavior 51 app.opts[:capture_erb_returns] = opts[:returns] if opts.has_key?(:returns) 52 end
# File lib/roda/plugins/capture_erb.rb 43 def self.load_dependencies(app, opts=OPTS) 44 app.plugin :render 45 end