Search code examples
htmlruby-on-railsrubyrecursionpartial

constructing HTML with recursive loop in ruby on rails


Hello guys I have array of hashes:

@buttons = [{:serno=>1, :parent_serno=>0, :name=>"Home"},
{:serno=>2, :parent_serno=>0, :name=>"Search"},
{:serno=>3, :parent_serno=>0, :name=>"Search Payment"},
{:serno=>4, :parent_serno=>1, :name=>"Problematic Search Payment"},
{:serno=>5, :parent_serno=>1, :name=>"Cash Error"},
{:serno=>6, :parent_serno=>2, :name=>"Payment Note"},
{:serno=>7, :parent_serno=>2, :name=>"Search Payment By Category"},
{:serno=>8, :parent_serno=>3, :name=>"Search Payment New"},
{:serno=>9, :parent_serno=>3, :name=>"User Mangement"}]

I want to create div for each array hash (for example hash x) that's "parent_serno == 0", write their name inside the div and create another div inside of it, for every array hash that's "parent_serno == hash x [:serno]".

I tried to create partial:

<% for m in @buttons %>
    <% unless @parent.present? %>
        <% if m[:parent_serno] == 0 %>
            <div>
                <%= m[:name] %>
                <% @parent = m[:serno] %>
                <% if @buttons.find{ |b| b[:parent_serno] == @parent }.present? %>
                    <% @buttons.find{ |b| b[:parent_serno] == @parent }.each do %>
                        <%= render partial: "navbar", object: @parent %>
                    <% end %>
                <% end %>
            </div>
        <% end%>
    <% else %>
        <% if m[:parent_serno] == @parent %>
            <div>
                <%= m[:name] %>
                <% @parent = m[:serno] %>
                <% if @buttons.find{ |b| b[:parent_serno] == @parent }.present? %>
                    <% @buttons.find{ |b| b[:parent_serno] == @parent }.each do %>
                        <%= render partial: "navbar", object: @parent %>
                    <% end %>
                <% end %>
            </div>
        <% end%>
    <% end %>
<% end %>

and render it in a another html.erb document, but apparently it just doesn't work :( It only gives me the name of the first hash in the array and recursion stops there I guess.


Solution

  • I think the partial you need should look something like this:

    _button.html.erb

    <div>
      <%= button[:name] %>
      <% render partial: 'button', 
          collection: @buttons.select { |b| b[:parent_serno] == button[:serno] } %>
    </div>
    

    index.html.erb

    ...
    <% render partial: 'button', 
        collection: @buttons.select { |b| b[:parent_serno] == 0 } %>
    ...