Ruby on Rails自定义帮助器输出HTML嵌套列表

问题描述:

在标题中我试图创建这样做的帮手,但我很挣扎。我得到错误或干脆为空列表如下: enter image description hereRuby on Rails自定义帮助器输出HTML嵌套列表

我要实现这一点: enter image description here 有得多逻辑简单地把这个代码视图。结果是散列,其中键是网站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 
+0

你能提供一个你想要的嵌套列表的例子吗? – Gerry

+0

我刚刚添加了一张显示我想要实现的图片。我把所有的代码放在视图中,但我真的想使用助手。 – Gregg

+0

因此,你想要显示散列中的书签或属于每个网站(“模型”关联)或两者(即在散列中并属于网站)的书签? – Gerry

如果你想坚持的帮手,那么这样的事情能够帮助:

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 

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

+0

谢谢!还有一件事是我有一种方法可以混合这个HTML和渲染partials? – Gregg

+0

当然,只需在部分内使用''调用帮助器方法即可在其中显示列表。 – Gerry

+0

我的意思是在帮助器中调用渲染器,但是我想明白了,谢谢;) – Gregg