使用嵌套的content_tag UL和LI创建导航菜单

时间:2011-09-23 19:07:56

标签: ruby-on-rails ruby-on-rails-3

我是Rails的相对新手,但想知道如何使用content_tag创建循环导航菜单。这看起来似乎有用,但我已经看到必须在content_tag循环中使用concat。我觉得我已经尝试了所有可能的途径,然后用心情搜索。非常感谢任何帮助。

供参考:

  • 我将@ page.root传递给我视图中的right_nav函数,以显示我可能处于的任何部分的完整分支。
  • for_menu检查是否应该在菜单中显示给定页面。

感谢。

  def right_nav(page)
    content_tag(:ul, :class => 'nav') do
      if !page.children.for_menu.empty?
        sub_nav(page)
      else
        concat content_tag(:li, link_to(page.title, page.path, :class=> current_menu_item?(page) ? 'current' : nil))
      end
    end
  end

  def sub_nav(parent)
    content_tag(:li, nav_link(parent)) do
      content_tag(:ul) do
        parent.children.for_menu.each do |subpage|
          if !subpage.children.for_menu.empty?
            sub_nav(subpage)
          else
            content_tag(:li, nav_link(subpage))
          end
        end
      end
    end
  end

  def nav_link(page)
    link_to(page.title, page.path)
  end

2 个答案:

答案 0 :(得分:0)

而不是使用每个,也许尝试在循环中使用collect;这样结果就会传回到链条上。

答案 1 :(得分:0)

内部content_tag:ul没有从每个返回值获得正确的返回值,因为每个返回它被调用的集合。

ruby-1.9.2-p180 :001 > [1,2,3,4].each {|n| n + 1}
 => [1, 2, 3, 4]

对于像content_tag这样的东西你可以使用inject将所有li / sub_nav项连接在一起并正确地返回到content_tag

def sub_nav(parent)
  content_tag(:li, nav_link(parent)) do
    content_tag(:ul) do
      parent.children.for_menu.inject('') do |result, subpage|
        if !subpage.children.for_menu.empty?
          result + sub_nav(subpage)
        else
          result + content_tag(:li, nav_link(subpage))
        end
      end
    end
  end
end