views:

168

answers:

2
+1  A: 

http://www.rubycentral.com/book/tut_containers.html

The yield statement will return the result of the block passed. So if you wanted to print (console?)

def my_div &block yield end

my_div { puts "Something" }

Would output "Something"

But: What is the idea of your method? Outputting a DIV?

Reuben Mallaby
weppos has a much better answer 8)
Reuben Mallaby
+3  A: 

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 %>
Simone Carletti