2012-05-23 2 views
0

У меня есть массив строк, которые выглядят примерно так:Создание меню СПАО в рельсах

"Folder1/FiLea/x1.png", "Folder1/FILEB/x2.png", «folder2/folder3/filec /x3.png».....

И моя цель состоит в том, чтобы создать меню СПАО как: http://iwantaneff.in/repo/plugins/menu-nav/drill.down/index.html

в рельсах я попытался с помощью метода group_by, но не везло. существу нужно создать структуру папок, как

  1. folder1
    • FiLea
      • x1.png
    • FILEB
      • x2.png
  2. folder2

и так далее .....

Любая идея о том, с чего начать? У меня возникают серьезные трудности с решением этой проблемы. Я использовал метод split для каждого массива, поэтому я получаю массив массивов, но, похоже, это никуда не денется. Я думаю, мне нужно использовать рекурсию, чтобы пройти через поддеревья?

ответ

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"]}}}}} 
+0

Дон У меня достаточно голосов для голосования ты поднялся чувак. Но это прекрасно! Спасибо огромное! –