2013-08-28 101 views
0

我有嵌套的文件夾對象就像文件系統上的目錄結構。一個用戶可以具有:遞歸迭代嵌套結構

  • 文件夾1
  • 文件夾2

    • 文件夾2a中
    • 文件夾2b中
      • 夾2BA
      • 夾2BB
  • 文件夾3

等,如爲用戶想遠了。我試圖在視圖中顯示上面的文件夾結構。

我可以在第一層做each,並在該級別的每個文件夾,做它的孩子each,然後在它的孩子each等,手動。但這似乎效率低下。我不希望有一個預先限定的水平。這似乎應該是自動化的,但我不太確定如何去做。此外,似乎遞歸不是一種選擇,因爲視圖中沒有方法。

這是一個幫手會有益嗎?我應該放棄並只加載一個子文件夾,當父文件夾被點擊,使用JavaScript?

+1

你可能想看看'awesome_nested_set'或'祖先'寶石。沒有意義重新發明輪子! –

+1

視圖中有任何東西,包括從內部呈現相同的視圖(認爲部分)。如果不是一種方法,什麼是「渲染」? –

回答

2

所以假設你有一個Folder類與subfolders方法,你會希望有一個遞推偏,說_folder.html.erb

<li><%= folder.name %></li> 
<% unless folder.subfolders.empty? -%> 
    <li> 
    <ul> 
     <%= render partial: "folder", collection: folder.subfolders %> 
    </ul> 
    </li> 
<% end -%> 

然後設置你的ul小號一些填充,你應該是好走。

到局部的初始呼叫可能會是這個樣子,其中@folders包含您的最高級別文件夾,並會生活在一個folders.html.erb或類似:

<ul> 
    <%= render partial: "folder", collection: @folders %> 
</ul> 
+0

我認爲這將正是我想要的!非常感謝! – Jenny

0

也許是這樣的:

class Folder < ActiveRecord::Base 

    def self.add_in_children(folder) 

    folder.children.each do |child| 

     @all_folders << [level,child] 
     @level+=1 
     if child.children 
     add_in_children(child) 
     end 
    end 
    end 

    def self.all_records 
    @all_folders=[] 
    @level=0 
    @folders=add_in_children('/') 
    end 

end 

Folder.all_records;