Как представить все записи от вложенного набора в реальное дерево HTML

Я создал эту функцию, которую я использую в сценариях удара.

# Function to echo in specified color
echoincolor () {
    case $1 in
        "red") tput setaf 1;;
        "green") tput setaf 2;;
        "orange") tput setaf 3;;
        "blue") tput setaf 4;;
        "purple") tput setaf 5;;
        "cyan") tput setaf 6;;
        "gray" | "grey") tput setaf 7;;
        "white") tput setaf 8;;
    esac
    echo "$2";
    tput sgr0
}

Затем я просто называю его как это echoincolor green "This text is in green!"

, Кроме того , использую printf

# Function to print in specified color
colorprintf () {
    case $1 in
        "red") tput setaf 1;;
        "green") tput setaf 2;;
        "orange") tput setaf 3;;
        "blue") tput setaf 4;;
        "purple") tput setaf 5;;
        "cyan") tput setaf 6;;
        "gray" | "grey") tput setaf 7;;
        "white") tput setaf 8;;
    esac
    printf "$2";
    tput sgr0
}

Затем просто вызов он как это colorprintf green "This text is in green!"

, Примечание , echo обеспечивает запаздывающую новую строку, в то время как printf не делает.

8
задан Pesto 15 September 2009 в 13:48
поделиться

4 ответа

Было бы неплохо, если бы вложенные наборы имели лучшие функции из коробки, не так ли?

Уловка как Вы обнаружили, что нужно построить дерево из плоского набора:

  • начать с набора всех узлов, отсортированных по lft
  • , первый узел является корнем, добавить его как корень дерева, перейти к следующему узлу
  • если это дочерний элемент предыдущего узла (lft между prev.lft и prev.rht), добавьте дочерний элемент в дерево и переместите его на один узел
  • , в противном случае переместитесь на один уровень вверх по дереву и повторите тест

, см. ниже:

def tree_from_set(set) #set must be in order
  buf = START_TAG(set[0])
  stack = []
  stack.push set[0]
  set[1..-1].each do |node|
    if stack.last.lft < node.lft < stack.last.rgt
      if node.leaf? #(node.rgt - node.lft == 1)
        buf << NODE_TAG(node)
      else
        buf << START_TAG(node)
        stack.push(node)
      end
    else#
      buf << END_TAG
      stack.pop
      retry
    end
  end
  buf <<END_TAG
end

def START_TAG(node) #for example
  "<li><p>#{node.name}</p><ul>"
end

def NODE_TAG(node)
  "<li><p>#{node.name}</p></li>"
end

def END_TAG
  "</li></ul>"
end 
7
ответ дан 5 December 2019 в 06:38
поделиться

Вы должны рекурсивно визуализировать партиал, который будет вызывать сам себя. Примерно так:

# customers/show.html.erb
<p>Name: <%= @customer.name %></p>
<h3>Categories</h3>
<ul>
  <%= render :partial => @customer.categories %>
</ul>

# categories/_category.html.erb
<li>
  <%= link_to category.name, category %>
  <ul>
    <%= render :partial => category.children %>
  </ul>
</li>

Это код Rails 2.3. Перед этим вам нужно будет вызвать маршруты и указать частичное имя.

3
ответ дан 5 December 2019 в 06:38
поделиться

Недавно я ответил на аналогичный вопрос для php (вложенный набор == измененная модель обхода дерева предварительного порядка).

Основная идея состоит в том, чтобы получить уже упорядоченные узлы и с индикатором глубины с помощью одного SQL-запроса . Оттуда это просто вопрос рендеринга вывода с помощью цикла или рекурсии, поэтому его будет легко преобразовать в ruby.

Я не знаком с плагином awesome_nested_set , но он уже может содержат опцию получения упорядоченного результата с аннотациями глубины, так как это довольно стандартная операция / необходимость при работе с вложенными наборами.

5
ответ дан 5 December 2019 в 06:38
поделиться

_tree.html.eb

@set = Category.root.self_and_descendants
<%= render :partial => 'item', :object => @set[0] %>

_item.html.erb

<% @set.shift %>
<li><%= item.name %>
<% unless item.leaf? %>
<ul>
  <%= render :partial => 'item', :collection => @set.select{|i| i.parent_id == item.id} %>
</ul>
<% end %>
</li>

Вы также можете сортировать их:

  <%= render :partial => 'item', :collection => @set.select{|i| i.parent_id == item.id}.sort_by(&:name) %>

но в этом случае вы должны УДАЛИТЬ эту строку:

<% @set.shift %>
3
ответ дан 5 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: