content_tags 里面 content_tag

content_tags inside of a content_tag

当我在 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

这导致导航栏仅包含 'server' 列表项:

<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 菜单?

看起来你真的很接近。要记住的是 content_tag returns 一个 HTML 字符串。当几个直接嵌套时,效果很好。但是,当您在同一嵌套级别有两个或更多 content_tag 表达式时,只有最后一个表达式返回到周围的块;较早的那些不会存储在任何地方,也不是块的结果。

我只看到两个地方有两个 content_tag 块处于同一嵌套级别。修复它的最简单方法可能是执行以下操作:

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

可能需要也可能不需要 html_safe;你可以两种方式都试试看。如果是这样,那只是因为字符串连接。除此之外,你看起来还不错。