使用多个产量来插入内容

我正在尝试使用yield在我的页面上插入内容,但每次操作都会从页面中删除整个内容。 我有一个主要yield ,工作正常:

   

但是在一个页面上显示的新内容中,我有另一个yield

 

当用户单击呈现的菜单时,应在该菜单下方显示新内容。

管理员/ _menu.html.erb

  

控制器:

 class AdminsController < ApplicationController def index end def test @users = User.paginate(page: params[:page]) end end 

test.html.erb

  

All users

...

当我从菜单中单击“用户”选项时,页面刷新,菜单消失,“body”内没有显示任何内容。 我希望内容显示在菜单下方。 如何使用第二次产量并完成此function?

我希望这个问题不会令人困惑。 如果问题令人困惑,请在评论中写下我,我会立即编辑。

谢谢 :)

所以,当你进入index页面时,你将获得将放置在主布局中的html片段,这段html看起来像这样:

 
<%= render 'admins/menu' %> <%= yield :admin %>

此代码将正确生成yield :admin

当你进入test页面时,你不再拥有这个HTML代码(因为它只属于index方法)。 因此,您放在content_for(:admin)块中的任何内容都将被忽略,因为没有人打印它。

您可能想要做的是为所有管理页面创建共享布局。 按照本指南 ,您将获得解决方案。

使用以下命令编辑application.html.erb布局:

 <%= content_for?(:content) ? yield(:content) : yield %> 

代替

 <%= yield %> 

然后在layouts文件夹中创建一个admins.html.erb文件来处理管理页面的布局。 像这样的东西:

 <% content_for :content do %>  
<%= render 'admins/menu' %> <%= yield %>
<% end %> <%= render template: "layouts/application" %>

会没事的。 然后在index.html.erbtest.html.erb放置常规HTML内容,而不使用content_for(:admin)块。 一切都应该工作正常,你将拥有自定义管理模板,与常规页面略有不同。

调用yield在辅助模块中不起作用,而content_for则可以,因此您应该在辅助文件中替换yield调用。

另外值得注意的是:当您仅在一个地方而不是多个地方使用该方法时,建议使用provide优于content_for 。 您将获得更好的性能,因为它在查找更多内容时不会打开缓冲区,并且您的意图对于可能看到您的代码的其他开发人员来说会更清晰。 (见http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-provide )