content_tag内的content_tags

时间:2015-02-24 15:55:15

标签: ruby-on-rails ruby-on-rails-4 twitter-bootstrap-3

当我在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菜单?

1 个答案:

答案 0 :(得分:1)

看起来你实际上非常接近。要记住的是content_tag返回HTML字符串。当几个直接嵌套时,它可以正常工作。但是当您在同一嵌套级别有两个或更多content_tag表达式时,只有最后一个表达式返回到周围的块;之前的版本不会存储在任何地方,也不是块的结果。

我只看到两个地方,你在同一嵌套级别有两个content_tag块。解决问题的最简单方法可能是执行以下操作:

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

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