ruby-on-rails - 使用多个 yield 插入内容

标签 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>  

Controller :

class AdminsController < ApplicationController

    def index
    end

    def test
        @users = User.paginate(page: params[:page])
    end
end

测试.html.erb

<% content_for :admin do %>

<h1>All users</h1>

...

<% end %>

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

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

谢谢你:)

最佳答案

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

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

此代码将正确地生成 :admin

当您转到测试 页面时,您不再有这段html 代码(因为它只属于index 方法)。因此,您放入 content_for(:admin) block 中的任何内容都将被忽略,因为没有人打印它。

您可能想要为所有管理页面创建一个共享布局。关注this guide然后你就会得到你的解决方案。

解决方案

使用以下代码编辑 application.html.erb 布局:

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

代替

<%= yield %>

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

<% 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) block .一切都应该正常工作,您将拥有自定义管理模板,其外观与常规页面略有不同。

关于ruby-on-rails - 使用多个 yield 插入内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20058412/

相关文章:

ruby-on-rails - Rails 4 - 将日期时间转换为单独的日期和时间字段

ruby-on-rails - 使用 Rails 存储线程安全的全局请求特定数据

javascript - Rails Assets 在生产中不可用

ruby-on-rails - 是否可以在 Heroku Cedar 上运行 capybara-webkit(即 fork 的 webkit_server)?

ruby-on-rails - 如何在 Rails 4 上使用 Ajax?

ruby-on-rails - 我如何将 Rails 模型指向 json 文件而不是创建表

ruby-on-rails - ruby rails : Creating child objects

ruby-on-rails - 那里有红隼 gem 吗?

python - Python 和 Ruby 中的快速模计算

ruby - Ruby 中的 `self` 发生了什么变化?