我正在尝试使用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>
控制器:
class AdminsController < ApplicationController
def index
end
def test
@users = User.paginate(page: params[:page])
end
end
test.html.erb
<% content_for :admin do %>
<h1>All users</h1>
...
<% end %>
当我从菜单中单击“用户”选项时,页面刷新,菜单消失,“body”内没有显示任何内容。我希望内容显示在菜单下方。如何使用第二个产量并完成此功能?
我希望这个问题不会引起混淆。如果问题令人困惑,请在评论中写下我,我会立即编辑。
谢谢:)
答案 0 :(得分:13)
因此,当您转到index
页面时,您将获得将放置在主布局中的html片段,并且这段HTML看起来像这样:
<div class="container">
<%= render 'admins/menu' %>
<%= yield :admin %>
</div>
此代码将yield :admin
正确。
当您转到test
页面时,您不再拥有此HTML代码(因为它只属于index
方法)。因此,您放在content_for(:admin)
块中的任何内容都将被忽略,因为没有人打印它。
您可能要做的是为所有管理页面创建共享布局。关注this guide,您将获得解决方案。
使用以下内容编辑application.html.erb
布局:
<%= content_for?(:content) ? yield(:content) : yield %>
而不是
<%= yield %>
然后在admins.html.erb
文件夹中创建一个layouts
文件来处理您的管理页面布局。像这样:
<% 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)
块。一切都应该正常工作,您将拥有自定义管理模板,与常规页面略有不同。
答案 1 :(得分:1)
调用yield
并不在帮助模块中工作,content_for
会这样做,因此您应该替换帮助文件中的yield
调用。
另外值得注意的是:当您仅在1个位置而不是多个位置使用该方法时,建议使用provide
而不是content_for
。您将获得更好的性能,因为它在寻找更多内容时不会打开缓冲区,并且您的意图对于可能看到您的代码的其他开发人员来说会更清晰。 (见http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-provide)
答案 2 :(得分:0)
我发现你必须在命名空间标签之前添加一个 yield
(没有实际输出)。
<div>
<% yield %>
<div class="mt-3">
<div class="text-2xl tracking-wide font-bold text-gray-900">
heading
<%= yield :heading %>
</div>
</div>
<div class="relative bg-white rounded-xl shadow-xl mb-8 min-h-28">
<%= yield %>
</div>
...