实现Rails helper方法:嵌套的哈希树到嵌套的HTML列表

时间:2014-01-26 02:08:05

标签: ruby-on-rails

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

2 个答案:

答案 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