当我在content_tag中嵌套多个其他content_tag时,HTML输出中只包含最近嵌套的标记。
我正在创建一个帮助函数来创建一个bootstrap导航栏:
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>
我需要对代码进行哪些更改才能生成预期的boostrap菜单?
答案 0 :(得分:1)
看起来你实际上非常接近。要记住的是content_tag
返回HTML字符串。当几个直接嵌套时,它可以正常工作。但是当您在同一嵌套级别有两个或更多content_tag表达式时,只有最后一个表达式返回到周围的块;之前的版本不会存储在任何地方,也不是块的结果。
我只看到两个地方,你在同一嵌套级别有两个content_tag块。解决问题的最简单方法可能是执行以下操作:
tag1 = content_tag( ... )
tag2 = content_tag( ... )
(tag1 + tag2).html_safe
可能需要或不需要html_safe;你可以尝试两种方式来看。如果是这样,那只是因为字符串连接。除此之外,你看起来很好。