使用多个产量来插入内容

Cri*_*ano 4 ruby yield ruby-on-rails content-for ruby-on-rails-4

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

<body>
    <%= render 'layouts/header' %>
    <div class="container">
      <%= yield %>
      <%= render 'layouts/footer' %>
    </div>
</body>
Run Code Online (Sandbox Code Playgroud)

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

<div class="container">
    <%= render 'admins/menu' %>
    <%= yield :admin %>
</div>
Run Code Online (Sandbox Code Playgroud)

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

管理员/ _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>  
Run Code Online (Sandbox Code Playgroud)

控制器:

class AdminsController < ApplicationController

    def index
    end

    def test
        @users = User.paginate(page: params[:page])
    end
end
Run Code Online (Sandbox Code Playgroud)

test.html.erb

<% content_for :admin do %>

<h1>All users</h1>

...

<% end %>
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢 :)

mar*_*wer 13

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

<div class="container">
    <%= render 'admins/menu' %>
    <%= yield :admin %>
</div>
Run Code Online (Sandbox Code Playgroud)

这段代码会yield :admin正常.

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

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

application.html.erb使用以下方法编辑布局:

<%= content_for?(:content) ? yield(:content) : yield %>
Run Code Online (Sandbox Code Playgroud)

代替

<%= yield %>
Run Code Online (Sandbox Code Playgroud)

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

<% content_for :content do %>
  <div class="container">
    <%= render 'admins/menu' %>
    <%= yield %>
  </div>
<% end %>
<%= render template: "layouts/application" %>
Run Code Online (Sandbox Code Playgroud)

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