【问题标题】:how to use content_for so that the content shows up in the layout如何使用 content_for 以便内容显示在布局中
【发布时间】:2013-07-19 09:26:45
【问题描述】:

我正在我的 rails 3.2 应用程序中测试 content_for 并遵循 rails 指南,但它们特定于实际文件,我似乎无法让 yield 工作:

application.html.erb 文件:

 <!DOCTYPE html>
 <html>
<head>
 ...
</head>

<body>




<%= yield :navigation %> #shouldn't this load the content_for block named :navigation specified in the _main_nav.html.erb partial? 

 <%= yield %>  #this load the index page content


</body>
 </html>

我创建了一个布局文件 _main_nav.html.erb(我知道我可以使用 进行渲染,但我正在尝试使用 content_for) _main_nav.html.erb 是:

<% content_for :navigation do %>
<ul>
 <li>Home</li>
 </ul>

<% end %>

他们就像我阅读 RailsGuide http://guides.rubyonrails.org/layouts_and_rendering.html#using-the-content-for-method 这应该有效。但事实并非如此。我没有收到错误。看起来很简单,但我很难过。

当我转到我的 index.html.erb 文件时,我希望看到这个结果:

  • 首页

【问题讨论】:

    标签: ruby-on-rails-3 content-for


    【解决方案1】:

    我相信您想要的是拥有一个包含您的 content_for 块的视图。因此,如果您有以下情况,例如:

    index.html.erb

    <% content_for :head do %> 
      <%= stylesheet_link_tag 'users' %> 
      #Above this will load the users stylesheet
    <% end %> 
    
    <h2>Example</h2> 
      <ul>
        <% @users.each do |users| %> 
          <li><%= user.name %></li>
        <% end %> 
      </ul>
    

    然后输出users 样式表中的内容,我们可以生成并传入content_for 名称的符号。

    Application.html.erb

        <!-DOCTYPE html> 
          <html> 
            <head> 
             <%= yield :head%>
               <title>This is my title</title 
             </head> 
            <body>
            <p>This is a test</p> 
            <%= yield %> 
         </html> 
    

    因此,回顾一下这里发生的事情,在我的示例中,我说我有一个 users 样式表,我想将它加载到我的 application.html.erb 的 &lt;head&gt;&lt;/head&gt; 中。为此,我设置了content_for,它是一个 Rails 助手,并给它一个标识符 sysmbol,它是 head,然后在 application.html.erb 中调用它,我在其中执行 yeild :head。所以我让我的应用程序要做的是,当我的index.html.erb 为该页面呈现时,application.html.erb 将加载我的users 样式表。希望这可以为您解决问题。

    更新说明

    此外,将content_foryield 结合使用的目的是允许您从ANY 视图将数据注入应用程序布局。再举一个例子。您可以拥有以下内容:

    <% content_for :title do %> My Title<% end %> 
    

    此处当控制器渲染视图模板并将其与应用程序布局结合时,文本My title 将被替换。 yield(:head) 可以在需要时轻松向特定页面添加更多元素。看看下面的例子:

    app/views/layouts/application.html.erb

    <% if content_for?(:navbar) %>
      <%= yield(:navbar) %>
    <% else %>
      <%# default navbar %>
      <section class="navbar"></section>
    <% end %>
    

    app/views/blah/index.html.erb

    <% content_for(:navbar) do %>
      <section class="navbar"></section>
    <% end %>
    

    进一步说明不确定您如何开发应用程序或使用什么设计框架,但您也可以查看Rails-Bootstrap-Navbar。也可以作为替代方案。

    【讨论】:

    • 大卫,谢谢。您是正确的,因为我的示例与指南不同-我已对其进行了更新,以更具体地说明我要做什么...似乎 content_for 块应该可以通过放置在视图中的任何位置被调用 但是我什至无法让这个简单的例子工作。我一定无法理解它或必须做其他事情才能让事情出现......
    • David,我非常感谢您抽出宝贵时间来理解我的问题,很抱歉这有点令人困惑......我看到您所做的并理解它与样式表相关。我不清楚的地方是为什么当我尝试创建一个导航来使用 content_for 时什么都没有出现?如果你能看看我重新编写的例子,如果你发现我的想法有什么问题,请告诉我。
    • @akkdio 再看一下带有附加链接的进一步更新的示例
    • 大卫,再次感谢您。我在我的应用程序中尝试了您的示例,但没有成功。我敢肯定,这很简单。但是什么?为了帮助我把我的例子放在 Github (github.com/akkdio/content_for) 上,希望快速浏览一下就能发现我的错误和想法。引导链接很有趣......但是,我试图先了解点点滴滴。再次感谢您。
    • @akkdio 你能向我解释为什么你实际上在body 标签中渲染两个yield 块。我不知道是不是只有我一个人,但我认为你把它分成某种div。因此,也许对于您的标题,您可以在其中包含&lt;div class="container_header"&gt;&lt;/div&gt; and encase your yeild`。如果这不起作用,您可以简单地尝试执行&lt;%= render 'layouts/header' 并完成并让它为您呈现您的内容。
    【解决方案2】:

    好的,我想我有一个解决方案。你的代码:

    <% content_for :navigation do %>
    <ul>
    <li>Home</li>
    </ul>
    <% end %>
    

    应该在正在加载的文件的顶部。您的 _header.html.erb 是部分的。如果您将此代码移动到 views/tasks/new.html.erb 中,则它会按预期工作。

    但是,要让它按您的意愿工作,您需要调整您的 application.html.erb 文件:

    <p>this is where we should see the "Home" link appear that is defined in _header.html.erb:</p>
    <section class="header">
    <% render 'layouts/header' %>
    <%= yield :navigation %>
    </section>
    

    请注意,我调用了不带 = 符号的 render erb 标签。这意味着我看不到部分标题的内容,但它确实加载了。如果您包含 = 符号,那么它仍然可以工作,但也会呈现您在部分中可能拥有的任何其他内容。 注意:render 标签必须在 yield 标签之上/之前。

    【讨论】:

    • 谢谢@hatStephensWork 我会试试看的。
    • 不用担心@akkdio,我还向您的 GitHub 存储库发出了拉取请求。任何问题都可以问。我是新手,但我想我明白这个是怎么回事!
    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2011-01-02
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多