Как справиться с рекурсивными проблемами родителей / детей? - PullRequest
0 голосов
/ 08 марта 2010

В веб-разработчике я часто сталкиваюсь с этими проблемами.

Например, у нас есть огромный список URL-адресов в следующем формате:

/businesses  
/businesses/food  
/businesses/food/wendys  
/businesses/food/wendys/chili  
/businesses/food/wendys/fries  
/businesses/food/wendys/chicken-nuggets  
/businesses/pharmacy/cvs  
/businesses/pharmacy/cvs/toothpaste  
/businesses/pharmacy/cvs/toothpaste/brand  
...

и затем нам нужно вывести каждый из них, где родительская категория находится в тегах h1, дочерняя - в тегах h2, а дочерние - в тегах h3.

Я могу справиться с этим, но я чувствую, что мой код грязный. Я уверен, что есть шаблон дизайна, который я могу использовать? Langs обычно ruby ​​/ php. как бы вы справились с этим?

Ответы [ 4 ]

1 голос
/ 08 марта 2010

Это немного сжато, но я надеюсь, что это имеет смысл. Конечно, вы можете протестировать его, чтобы настроить для наиболее оптимизированного результата.

s.each { |row|
  puts row[1..-1].split('/')[0..2].each_with_index \
  {|v,i| 
    tag = "h#{i+1}";
    print "<#{tag}>#{v}</#{tag}> "
  }
}

подробнее

s.each do |row|                             # 'each' will split each row
  row = row[1..-1]                          # string of the row without '/'
  words = row.split('/')                    # split into words
  words = words[0..2]                       # we just need first 3 tags
  words.each_with_index do |word, index|    # get index and value of each element in word array
    tag = "h#{index+1}"                       # use index to dynamically generate tag
    print "<#{tag}>#{word}</#{tag}> "       # use the tag and word to generate output
  end
end

Вы должны

  1. поместить метод в библиотеку соответствующего места
  2. собрать значения в массив
  3. перебрать массив в представлении и сгенерировать теги
0 голосов
/ 08 марта 2010

Это, очевидно, нуждается в еще большей любви, но, возможно, это поможет вам начать:

>> path = "/businesses/pharmacy/cvs/toothpaste/brand" 
>> path.split('/',4)[1..-1].each_with_index { |el,i| puts "<h#{i+1}>#{el}</h#{i+1}>" }
<h1>businesses</h1>
<h2>pharmacy</h2>
<h3>cvs/toothpaste/brand</h3>

edit: Вот еще один способ, о котором я могу думать:

>> [*0..2].zip(path.split('/',4).drop(1)).each { |i,el| puts "<h#{i}>#{el}</h#{i}>" }
0 голосов
/ 08 марта 2010
0 голосов
/ 08 марта 2010

Не совсем уверен, какое решение вы ищете, но я бы начал в этом направлении, сначала сделайте дерево из вашего списка URL:

s = '/businesses  
/businesses/food  
/businesses/food/wendys  
/businesses/food/wendys/chili  
/businesses/food/wendys/fries  
/businesses/food/wendys/chicken-nuggets  
/businesses/pharmacy/cvs  
/businesses/pharmacy/cvs/toothpaste  
/businesses/pharmacy/cvs/toothpaste/brand'
h = {}
s.split("\n").map(&:strip).each do |row|
  lh = h
  row[1..-1].split('/').each do |item|
    lh[item] ||= {}
    lh = lh[item]
  end
end

и затем распечатать его рекурсивно, без использования тегов> H3:

def rprint h, level=1
  h.each do |k,v|
    puts "<li><h#{level}>#{k}</h#{level}>"
    unless v.empty?
      puts "<ul>"
      rprint(v, level == 3 ? 3 : level + 1)
      puts "</ul>"
    end
    puts "</li>"
  end
end

rprint h

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...