2012-10-21 72 views
0

好了,所以我有這個循環Ruby中的這個遞歸循環有什麼問題?

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,如果頁面有孩子,那麼我想要所有的孩子都有一個li的另一個ul ... ext ....但是我的循環關閉了......有什麼我在做的想法錯誤

回答

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")) 
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 
+0

這需要一定的拋光,注意,助手返回字符串,他們不執行的副作用使像ERB視圖。 – tokland