Я создал эту функцию, которую я использую в сценариях удара.
# 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
не делает.
Было бы неплохо, если бы вложенные наборы имели лучшие функции из коробки, не так ли?
Уловка как Вы обнаружили, что нужно построить дерево из плоского набора:
, см. ниже:
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
Вы должны рекурсивно визуализировать партиал, который будет вызывать сам себя. Примерно так:
# 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. Перед этим вам нужно будет вызвать маршруты и указать частичное имя.
Недавно я ответил на аналогичный вопрос для php (вложенный набор == измененная модель обхода дерева предварительного порядка).
Основная идея состоит в том, чтобы получить уже упорядоченные узлы и с индикатором глубины с помощью одного SQL-запроса . Оттуда это просто вопрос рендеринга вывода с помощью цикла или рекурсии, поэтому его будет легко преобразовать в ruby.
Я не знаком с плагином awesome_nested_set
, но он уже может содержат опцию получения упорядоченного результата с аннотациями глубины, так как это довольно стандартная операция / необходимость при работе с вложенными наборами.
_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 %>