我正在测试我的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文件时,我希望看到这个结果:
答案 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_for
与yield
结合使用的目的是允许您从 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标记之上/之前。