<ul> <% for category in @categories %> <li><%= link_to h(category.title), :action => 'edit', :id => category %> <%= find_all_subcategories(category) %> </li> <% end %> </ul>
Place this in a helper:
def find_all_subcategories(category) if category.children.size > 0 ret = '<ul>' category.children.each { |subcat| if subcat.children.size > 0 ret += '<li>' ret += link_to h(subcat.title), :action => 'edit', :id => subcat ret += find_all_subcategories(subcat) ret += '</li>' else ret += '<li>' ret += link_to h(subcat.title), :action => 'edit', :id => subcat ret += '</li>' end } ret += '</ul>' end end
in view:
<%= list_all_activities(@activities) %>
in helper:
def list_all_activities(activities)
if activities.size > 0
ret = "<ul>\n"
activities.each { |subactivity|
ret += "<li>\n"
ret += link_to h(subactivity.name), :action => 'edit', :id => subactivity
ret += link_to " "+h("<add>"), :action =>'new', :id => subactivity
ret += "\n"
if subactivity.children.size > 0
ret += list_all_activities(subactivity.children)
end
ret += "</li>\n"
}
ret += "</ul>\n"
end
end
also, if you have to display in more than one format, you'd want to make a visitor pattern, with a visitor function on the model that you can pass a block to for marking up a line (or, separate blocks for branches / leaves)