2015-02-24 87 views
1

當我在content_tag中嵌套多個其他content_tag時,HTML輸出中只包含最近嵌套的標記。content_tag內容content_tag

我創建創建一個引導導航欄的輔助功能:

def navigation_menu 
    content_tag(:nav, class: "navbar navbar-default") do 
     content_tag(:div, class: "container") do 
      content_tag(:div, class: "navbar-header") do 
       button_tag(type: "button", class: "navbar-toggle collapsed") do 
        content_tag(:span, "Toggle navigation", class: "sr-only") 
        content_tag(:span, class: "icon-bar") 
        content_tag(:span, class: "icon-bar") 
        content_tag(:span, class: "icon-bar") 
       end 
       content_tag(:a, "Brand", {class: "navbar-brand", href: "#"}) 
      end 
      content_tag(:div, class: "collapse navbar-collapse") do 
       content_tag(:ul, class: "nav navbar-nav") do 
        content_tag(:li) do 
         link_to "Companies", companies_path 
        end 
        content_tag(:li) do 
         link_to "Servers", servers_path 
        end 
       end 
      end 
     end 
    end 
end 

這導致導航欄只有在「服務器」列表項包括:

<nav class="navbar navbar-default"> 
    <div class="container"> 
    <div class="collapse navbar-collapse"> 
     <ul class="nav navbar-nav"> 
     <li><a href="/servers">Servers</a></li> 
     </ul> 
    </div> 
    </div> 
</nav> 

什麼變化,我需要使我的代碼,以產生預期的助推器菜單?

+2

您必須將所有content_tags連接到一個字符串。而不是讓它html_safe。一團糟。你應該考慮渲染一個部分。 – 2015-02-24 16:01:42

回答

1

看起來你真的很接近。要記住的是content_tag返回一個HTML字符串。當幾個直接嵌套時,它運行良好。但是當你有兩個或多個content_tag表達式在相同的嵌套級別時,只有最後一個返回到周圍的塊;先前的那些不會被存儲到任何地方,並且不是塊的結果。

我看到只有兩個地方你有兩個content_tag塊在相同的嵌套級別。修復它的最簡單的方法可能是做類似的事情:

tag1 = content_tag(...) 
tag2 = content_tag(...) 
(tag1 + tag2).html_safe 

html_safe可能或不需要;你可以嘗試兩種方式來看看。如果是這樣,那只是因爲字符串連接。除此之外,你有什麼看起來很好。

+0

這非常合理,謝謝! – hypern 2015-02-24 16:36:59

相關問題