实施导轨辅助方法:嵌套的哈希树到嵌套的HTML列表



我正在尝试将嵌套的哈希树转换为嵌套的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

相关内容

  • 没有找到相关文章

最新更新