使用多个产量来插入内容
我正在尝试使用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.erb
和test.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 )