使用多个产量来插入内容

时间:2013-11-18 21:35:03

标签: ruby-on-rails ruby ruby-on-rails-4 yield content-for

我正在尝试使用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”内没有显示任何内容。我希望内容显示在菜单下方。如何使用第二个产量并完成此功能?

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

谢谢:)

3 个答案:

答案 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.erbtest.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>
...