8

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

4

2 回答 2

12

我相信你想要的是有一个包含你的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.

应用程序.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样式表,我想将它加载到<head></head>我的 application.html.erb 中。为此,我将content_forwhich 设置为 Rails 助手,并为其指定标识符 sysmbol,head然后在application.html.erbwhere I do中调用它yeild :head。所以我让我的应用程序要做的是,当我index.html.erb为该页面呈现时,application.html.erb将加载我的users样式表。希望这可以为您解决问题。

更新说明

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

<% 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 %>

app/views/blah/index.html.erb

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

进一步说明不确定您如何开发应用程序或使用什么设计框架,但您也可以查看Rails-Bootstrap-Navbar。也可能是另一种选择。

于 2013-07-20T10:36:17.953 回答
9

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

<% 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 标签。这意味着我看不到部分标题的内容,但它确实加载了。如果您包含 = 符号,那么它仍然可以工作,但也会呈现您在部分中可能拥有的任何其他内容。注意:渲染标签必须在产量标签之上/之前。

于 2015-03-17T12:09:28.873 回答