mongolrgata
mongolrgata

Reputation: 2017

HAML generate nested divs in loop

Is there any way to generate many divs nested each other?

I expect print some like this:

<div>
  <div>
    <div>
      <div>
        <div>
        </div>
      </div>
    </div>
  </div>
</div>

Simple loop is not helping

- (1..5).each do |i|
  %div

Goes to

<div></div>
<div></div>
<div></div>
<div></div>
<div></div>

Upvotes: 3

Views: 510

Answers (1)

user208769
user208769

Reputation: 2226

There isn't any way of doing this in pure haml, by design.

Firstly, ask yourself: Do you really need this? There are often far better ways to achieve the result you want.

In my case, I needed an arbitrary nesting of divs with a particular class, based on a number I was given externally. I added the following to my rails helpers:

  def nestify(css_class, level, &block)
    if level > 0
      content_tag(:div, class: css_class) { nestify(css_class, level - 1, &block) }
    else
      yield
      ""
    end
  end

Then, in your haml, you use it with a block:

= nestify('each-div-has-this-class', 5) do
  Content for inner div.

[Edit] Quick note: I wrote this a while back, can't remember why - but this code is not production ready. Ruby doesn't work well with recursive functions. Please flatten it into a loop for better performance / scalability.

Upvotes: 2

Related Questions