SB
2007-Apr-01  23:48 UTC
[Betternestedset-talk] Turning an Array of Array into Nested Lists
By way of introduction, I want to use betternestedset to generate
nested comments.  I figured out the generation of html tags and simply
needed a way to produce an array of arrays to turn into links.
Thought I''d share some useful code snippets that can maybe be improved
or used by people here.
Here''s a code snippet I use to generate a nested <ol> or
<ul> from an
array of arrays.  The main difficulty I have is not being able to pass
it a cycle method to create alternating styles without hard-coding it
into the method (I''d love to know if someone can show me a clean way
to do it).
In application helper:
  def html_list(type, elements, options = {}, &block)
    items = elements.map  do |element|
      if element.is_a?(Array)
        element = html_list(type, element, options, &block)
      else
        element = block.call(element) if block
        content_tag("li", element)
      end
    end
    content_tag(type, items, options)
  end
  def ul(*args, &block)
    html_list("ul", *args, &block)
  end
  def ol(*args, &block)
    html_list("ol", *args, &block)
  end
In your views (this will be a proper nested list):
<%= ul(["first", "first", ["second",
["third", "third", "third"],
"second", "second", ["third", "third",
"third", ["fourth", "fourth",
"fourth"]]]]) {|x| link_to x, :controller => "account",
:action =>
"signup" }%>
As you can see, passing a block will help you format the objects.  I
haven''t yet tested this with objects but it should work in one form or
another.
Any other examples used by members of this list would be appreciated.
Sam