Ruby 在 Rails 自定义助手输出 HTML 嵌套列表

Ruby on Rails Custom Helper outputting HTML nested list

如标题所示,我正在尝试创建可以执行此操作的助手,但我正在努力。我收到错误或只是像这样的空列表:

我想实现这个: 简单地把这段代码放在视图中有太多的逻辑。结果是一个散列,其中键是网站 ID,值是书签 ID 数组或只是书签 ID。

我的代码:

module WebsitesHelper
  def present_search_results(results)
    content_tag(:ul, class: "websites-list") do
      results.each do |key, value|
        website = Website.find(key)
        concat(content_tag(:li, website.url, class: "website-#{key}") do
          bookmarks = website.bookmarks.select do |b|
            if value.is_a?(Array)
              value.include?(b.id)
            else
              value = b.id
            end  
          end
          content_tag(:ul, nil, id: "website-#{key}") do
            bookmarks.each do |b|
              content_tag(:li, b.title)
            end
          end
        end)      
      end
    end  
  end
end

如果您想坚持使用助手,那么这样的事情可能会有所帮助:

def present_search_results(results)
  content_tag(:ul, class: "websites-list") do

    results.map do |website_id, bookmarks|
      bookmarks = [bookmarks] unless bookmarks.is_a?(Array)

      content_tag(:li, class: "website-#{website_id}") do
        website = Website.find(website_id)
        concat(website.url)
        concat(
          content_tag(:ul, class: "bookmarks-list") do

            bookmarks.map do |bookmark_id| 
              bookmark = Bookmark.find(bookmark_id)
              content_tag(:li, bookmark.title)
            end.reduce(:+)
          end
        )
      end
    end.reduce(:+)
  end
end

但是,在我看来,该代码不容易阅读,因此您可以改用普通的 html,如下所示:

def present_search_results(results)
  list = "<ul class='websites-list'>"

  results.each do |(website_id, bookmarks)|
    bookmarks = [bookmarks] unless bookmarks.is_a?(Array)
    website   = Website.find(website_id)

    list += "<li class='website-#{website_id}'>#{website}"
    list += "<ul class='bookmarks-list'>"

    bookmarks.each do |bookmark_id|
      bookmark = Bookmark.find(bookmark_id)
      list += "<li>#{bookmark.title}</li>"
    end

    list += "</ul></li>"
  end

  list += "</ul>"
  list.html_safe
end

我更喜欢这个,因为它更容易阅读。但是两者都输出了你想要的列表。