如何使用content_for以便内容显示在布局中

时间:2013-07-19 23:55:16

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

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

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(我知道我可以使用&lt;%= render'layouts / header'%&gt;进行渲染,但我尝试使用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文件时,我希望看到这个结果:

  • 主页

2 个答案:

答案 0 :(得分:10)

我相信你想拥有的视图将包含你的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的<head></head>。为此,我设置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)可以轻松地向特定页面添加更多元素。看一下下面的例子:

应用/视图/布局/ application.html.erb

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

应用/视图/嗒嗒/ index.html.erb

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

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

答案 1 :(得分:6)

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

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

应位于 loading 文件的顶部。你的_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>

注意,我在没有=符号的情况下调用了渲染erb标记。这意味着我没有看到标题的内容部分,但它确实加载。如果您包含=符号,那么它仍然有效,但也会呈现您在局部中可能拥有的任何其他内容。 注意:render标记必须位于yield标记之上/之前。