我正在尝试使用 yield
在我的页面上插入内容,但每次操作都会从页面中删除全部内容。我有一个主要的 yield
可以正常工作:
<body>
<%= render 'layouts/header' %>
<div class="container">
<%= yield %>
<%= render 'layouts/footer' %>
</div>
</body>
但在显示在一页上的新内容中,我还有另一个 yield
:
<div class="container">
<%= render 'admins/menu' %>
<%= yield :admin %>
</div>
当用户单击呈现的菜单时,新内容应显示在该菜单下方。
管理员/_menu.html.erb
<div class="navbar">
<div class="navbar-inner">
<div class="container">
<ul class="nav">
<li><%= link_to "Users", :controller => "admins", :action => "test" %></li>
<li><%= link_to "1", ... %></li>
<li><%= link_to "2", ... %></li>
<li><%= link_to "3", ... %></li>
</ul>
</div>
</div>
</div>
Controller :
class AdminsController < ApplicationController
def index
end
def test
@users = User.paginate(page: params[:page])
end
end
测试.html.erb
<% content_for :admin do %>
<h1>All users</h1>
...
<% end %>
当我从菜单中单击“用户”选项时,页面刷新,菜单消失并且“正文”内不显示任何内容。我希望内容显示在菜单下方。如何使用第二个 yield 并完成此功能?
我希望这个问题不会令人困惑。如果问题令人困惑,请在评论中写信给我,我会立即对其进行编辑。
谢谢你:)
最佳答案
因此,当您转到 index
页面时,您将获得将放置在主布局中的一段 html,这段 html 如下所示:
<div class="container">
<%= render 'admins/menu' %>
<%= yield :admin %>
</div>
此代码将正确地生成 :admin
。
当您转到测试
页面时,您不再有这段html 代码(因为它只属于index
方法)。因此,您放入 content_for(:admin)
block 中的任何内容都将被忽略,因为没有人打印它。
您可能想要为所有管理页面创建一个共享布局。关注this guide然后你就会得到你的解决方案。
解决方案
使用以下代码编辑 application.html.erb
布局:
<%= content_for?(:content) ? yield(:content) : yield %>
代替
<%= yield %>
然后在 layouts
文件夹中创建一个 admins.html.erb
文件来处理管理页面的布局。像这样:
<% content_for :content do %>
<div class="container">
<%= render 'admins/menu' %>
<%= yield %>
</div>
<% end %>
<%= render template: "layouts/application" %>
会做的很好。然后在 index.html.erb
和 test.html.erb
中放置常规的 HTML 内容,而不使用 content_for(:admin)
block .一切都应该正常工作,您将拥有自定义管理模板,其外观与常规页面略有不同。
关于ruby-on-rails - 使用多个 yield 插入内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20058412/