same html elements rendering twice on page

hey all,

My index.html.haml:

- wrap do
  - page_title "Teams List View"

application_helper.rb:

  def page_title(title)
    content_tag :h1, title
  end

  def wrap(&block)
    concat(content_tag(:div, capture(&block), :class =>
"generic_header"))
  end

I load in browser and get:
<div class="generic_header"><h1>Teams List View</h1></div>
<div class="generic_header"><h1>Teams List View</h1></div>

It's rendered twice. Not sure why. I invoke the wrap iterator, passing
a block into the argument list, wrap receivers it as a reference, then
I concat a div, use capture to render the page title as nested within
div, and assign div class. Not sure what I am doing wrong.

What happens if you get rid of concat()?

By the way, if you put some html at the top of the page, e.g.

%p Index.html.haml
- wrap do
  - page_title "Teams List View"

Your wrap() method will double render the whole page.

Based on my experiments with haml, I would never consider using a
multiline ruby block that contains a rails helper. The results are too
unpredictable. Both of these syntaxes do what you want (without
concat):

- wrap do
  - page_title "Teams List View"

- wrap do
  = page_title "Teams List View"

Note that in this code:

content_tag(:div, capture(&block), :class =>"generic_header")

...capture() does indirectly what block.call() does directly.

thanks for response, and the explanation of capture(). When I removed
the concat from the helper, the title stopped rendering twice. I
thought the concat was used to concatenate the two blocks of html, but
after reading documentation it appears it's to render haml without
using "=".

It seems to me that the = sign in haml is arbitrary and capricious. For
instance, how does the syntax:

- wrap do
  - page_title "Teams List View"

result in anything being added to the page?