2017-04-16 88 views
1

在標題中我試圖創建這樣做的幫手,但我很掙扎。我得到錯誤或乾脆爲空列表如下: 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

回答

0

如果你想堅持的幫手,那麼這樣的事情能夠幫助:

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

當然,只需在部分內使用'<%= present_search_results(results)%>'調用幫助器方法即可在其中顯示列表。 – Gerry

+0

我的意思是在幫助器中調用渲染器,但是我想明白了,謝謝;) – Gregg