5

我正在尝试在我的页面上插入内容,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 %>

当我从菜单中单击“用户”选项时,页面刷新,菜单消失,并且“正文”内不显示任何内容。我希望内容显示在菜单下方。如何使用第二个产量并完成此功能?

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

谢谢 :)

4

3 回答 3

15

因此,当您进入index页面时,您将获得将放置在主布局中的一段 html,这段 html 如下所示:

<div class="container">
    <%= render 'admins/menu' %>
    <%= yield :admin %>
</div>

此代码将yield :admin正确。

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

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

解决方案

使用此编辑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.erband中test.html.erb只放置常规的 HTML 内容,而不使用该content_for(:admin)块。一切都应该正常工作,您将拥有自定义管理模板,其外观与常规页面略有不同。

于 2013-11-18T22:10:16.347 回答
1

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

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

于 2013-11-18T22:18:02.873 回答
0

I found that you have to add an yield (without actually outputing) before the namespaced tags.

<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>
...
于 2021-01-05T13:44:13.960 回答