我正在尝试将嵌套的哈希树转换为嵌套的HTML列表。到目前为止,我已经创建了帖子和标签模型,并使用闭合树实现了标签模型的层次结构。
以下是我从另一篇文章中找到的辅助方法,以制作递归方法将哈希渲染到嵌套的列表集:
def hash_list_tag(hash)
html = content_tag(:ul) {
ul_contents = ""
ul_contents << content_tag(:li, hash[:parent])
hash[:children].each do |child|
ul_contents << hash_list_tag(child)
end
ul_contents.html_safe
}.html_safe
end
我只是将此代码插入了我的助手部分(application_helper.rb),而无需更改任何内容。
之后,我将以下内容嵌入到查看页面(index.html.erb)中,以将哈希渲染到嵌套的HTML列表:
<div>
<% hash_list_tag Tag.hash_tree do |tag| %>
<%= link_to tag.name, tag_path(tag.name) %>
<% end %>
</div>
但是,我收到了此错误:
ActionView::Template::Error (undefined method `each' for nil:NilClass):
1:
2:
3: <div>
4: <% hash_list_tag Tag.hash_tree do |tag| %>
5: <%= link_to tag.name, tag_path(tag.name) %>
6: <% end %>
7: </div>
app/helpers/application_helper.rb:14:in `block in hash_list_tag'
app/helpers/application_helper.rb:11:in `hash_list_tag'
app/views/posts/index.html.erb:4:in `_app_views_posts_index_html_erb__1316616690179183751_70207605533880'
做
hash[:children].each do |child|
也没有孩子,结果是零,每个方法都没有调用。(阅读错误消息)。因此,您需要检查这种情况:
if !(hash[:children].nil?)
hash[:children].each do |child|
使用闭合树,您不会与:父母和:孩子键。以下代码将解决您的问题。
html = content_tag(:ul) {
ul_contents = ""
hash.each do |key, value|
ul_contents << content_tag(:li, key)
if value.present?
value.each do |child|
ul_contents << hash_list_tag(child)
end
end
end
ul_contents.html_safe
}.html_safe