呈现具有未知/无限嵌套的层次列表视图



以下模式是嵌套在其他列表项中的一组列表。

<ul id="nestedlist">
<li><a href="#"> 1</a>
<ul>
<li><a href="#"> 1.1</a>
<ul>
<li><a href="#"> 1.1.1</a></li>
<li><a href="#"> 1.1.2</a></li>
<li><a href="#"> 1.1.3</a></li>
</ul>
</li>
<li class="connect"><a href="#"> 1.2</a>
<ul>
<li><a href="#"> 1.2.1</a></li>
<li><a href="#"> 1.2.2</a></li>
<li><a href="#"> 1.2.3</a></li>
<li><a href="#"> 1.2.4</a></li>
<li><a href="#"> 1.2.5</a>
<ul>
<li><a href="#"> 1.2.5.1</a></li>
<li><a href="#"> 1.2.5.2</a>
<ul>
<li><a href="#"> 1.2.5.2.1</a></li>
<li><a href="#"> 1.2.5.2.2</a></li>
</ul>
</li>
<li><a href="#"> 1.2.5.3</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>

Node

belongs_to :parentnode
has_many :children_nodes, foreign_key: :parentnode_id, class_name: 'Parentnode'

因此,可以在层次结构中定义无限数量的级别。

视图渲染是一种基本模式,每个节点都可以成为父节点

Parentnode.children_nodes.each_with_index do |node, index|
node.name
**parent_indicies.(index + 1)**
end

在事先不知道嵌套级别的情况下,如何在rails视图中渲染它来表示每个节点级别及其嵌套级别?

您可以使用rails辅助方法来生成rails视图。

示例:

content_tag(:ul) do
(1..10).each do |node|
concat content_tag(:li, node)
end
end

逻辑是使用递归:

def generate_list(node, level)
return if node == nil
#put logic of generating ul li here.
#add ul if node.children_nodes.present?
#else add li.
node.children_nodes.each_with_index |node, index|
generate_list(node, "#{level}.#{index+1}"
end
end

这只是基本逻辑。我希望你能完成剩下的部分。如果你仍然面临困难,请告诉我。

更新了以下工作代码以生成html:

class Node
attr_accessor :val, :children_nodes
def initialize(value)
self.val = value
self.children_nodes = []
end
end
p1 = Node.new("P")
n1 = Node.new("1")
n2 = Node.new("2")
p1.children_nodes.push(n1)
p1.children_nodes.push(n2)
def generate_list(node, level, final_str)
return if node == nil
if node.children_nodes.size > 0
final_str << "<li> #{node.val}"
final_str << "<ul> "
else
final_str << "<li> #{node.val} </li>"
end
node.children_nodes.each_with_index do |n, index|
generate_list(n, "#{level}.#{index+1}", final_str)
end
if node.children_nodes.size > 0
final_str << "</ul> "
final_str << "</li>"
end
end

def generate(node)
final_str = ""
final_str << "<ul>"
generate_list(node, 1, final_str)
final_str << "</ul>"
final_str
end
puts generate(p1)

最新更新