Search code examples
ruby-on-railsrubyhelper

How do I create a helper with block?


I want to make a helper like the following.

def my_div some_options, &block
  # How do I print the result of the block?
end

Solution

  • You should use CaptureHelper.

    def my_div(some_options, &block)
      # capture the value of the block a string
      content = capture(&block)
      # concat the value to the output
      concat(content)
    end
    
    <% my_div([]) do %>
      <p>The content</p>
    <% end %>
    
    
    def my_div(some_options, &block)
      # capture the value of the block a string
      # and returns it. You MUST use <%= in your view.
      capture(&block)
    end
    
    <%= my_div([]) do %>
      <p>The content</p>
    <% end %>
    

    Use capture + concat if you need to concat the output. Use capture if you need to capture and then reuse the content. If your block doesn't explicitely use <%=, then you MUST call concat (preferred way).

    This is an example of a method that hides the content if the user it not an admin.

    def if_admin(options = {}, &block)
      if admin?
        concat content_tag(:div, capture(&block), options)
      end
    end
    
    <% if_admin(:style => "admin") do %>
    <p>Super secret content.</p>
    <% end %>