在rails中创建向下钻取菜单

时间:2012-05-23 14:47:56

标签: jquery ruby-on-rails ruby arrays drilldown

我有一个类似于:

的字符串数组

“folder1 / filea / x1.png”,“folder1 / fileb / x2.png”,“folder2 / folder3 / filec / x3.png”.....

我的目标是创建一个向下钻取菜单,如:http://iwantaneff.in/repo/plugins/menu-nav/drill.down/index.html

在rails中我尝试过使用group_by方法,但没有运气。 基本上我需要创建一个像

这样的文件夹结构
  1. folder1中
    • FILEA
      • x1.png
    • FILEB
      • x2.png
  2. 文件夹2
  3. 依旧.....

    知道从哪里开始?我在解决这个问题时遇到了很大困难。我在每个数组上都使用了split方法,所以我得到了一个数组数组,但这似乎没有得到任何结果。我想我需要使用递归来遍历子树?

1 个答案:

答案 0 :(得分:4)

答案很简单)使用递归来解析和插入数据

解析的例子=>

   def parse(hash)
      hash.each do |k,v|
        files = v.select{|e| e.size == 1}
        hash[k] = {"files" => files.flatten} unless files.empty?
        dirs = v - files
        unless dirs.empty? 
          dirs = parse(dirs.group_by{|e| e.shift})
          if files.empty?
            hash[k] = dirs  
          else
            hash[k].merge! dirs
          end
        end 
      end
    end
输入

h = {:root =>  ["folder1/filea/x1.png", "folder1/fileb/x2.png","folder1/fileb/folder4/111", "folder2/folder3/filec/x3.png","folder2/folder3/filec/x4.png"].map{|e| e.split("/")}}

parse(h)

输出

{:root=>{"folder1"=>{"filea"=>{"files"=>["x1.png"]}, "fileb"=>{"files"=>["x2.png"], "folder4"=>{"files"=>["111"]}}}, "folder2"=>{"folder3"=>{"filec"=>{"files"=>["x3.png", "x4.png"]}}}}}
相关问题