0

好的,所以我有这个循环

def page_children(page)
  content_tag :li do
    link_to page.url, "/#{page.url_path}/#{page.url}"
    if page.children.any?
      content_tag :ul do
        page_children(page)
      end
    end
  end
end

我不断得到stack level too deep

我将这个gem用于我的树结构,我的模型和 haml 如下

class Page < ActiveRecord::Base  
  acts_as_tree :order => 'sort_order'
  belongs_to :parent, :class_name => "Page" 
  scope :parent_nav, lambda{ |navigation| where(:parent_id => nil, :is_home => 0, :nav => navigation).order("sort_order") }
end

我的haml如下

%ul
 - Page.parent_nav("Attend").each do |page|
 = page_children(page)

基本上我想要每个页面都有一个 li,如果页面有孩子,那么我想要另一个 ul,所有孩子都有一个 li ......

4

2 回答 2

4

page_children当你递归调用它时,你并没有改变你给出的参数。可能类似于以下内容(未经测试):

def page_children(page)
  content_tag :li do
    link_to page.url, "/#{page.url_path}/#{page.url}"
    page.children.each do |child|
      content_tag :ul do
        page_children(child)
      end
    end
  end
end
于 2012-10-21T18:03:30.017 回答
1

我会写(未经测试):

def render_pages(pages)
  return "" if pages.empty?
  content_tag(:ul) do
    pages.map do |page| 
      content_tag(:li) do
        link = link_to(page.url, helper_to_generate_the_page_path(page))
        link + render_pages(page.children)
      end
    end.join.html_safe
  end
end

= render_pages(Page.parent_nav("Attend"))
于 2012-10-21T19:39:10.697 回答