我正在尝试将嵌套的哈希树转换为嵌套的HTML列表。到目前为止,我已经创建了Post和Tag模型,并使用Closure Tree为Tag模型实现了层次结构。
以下是我从another post找到的一个辅助方法,用于创建一个递归方法,将哈希值呈现给一组嵌套列表:
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'
答案 0 :(得分:0)
当你这样做时
hash[:children].each do |child|
并且没有子节点,结果是nil,没有调用每个的方法。 (阅读错误信息)。所以你需要检查这个案例:
if !(hash[:children].nil?)
hash[:children].each do |child|
答案 1 :(得分:0)
使用闭包树,你不会得到哈希:parent和:children键。 下面的代码将解决您的问题。
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