Ruby on rails 3 同一页面上的多个内容\u

Ruby on rails 3 同一页面上的多个内容\u,ruby-on-rails-3,yield,content-for,Ruby On Rails 3,Yield,Content For,我的应用程序中有一大块HTML,我希望将其移动到共享模板中,然后使用content_插入必要的内容。但是,如果我在同一个布局文件中多次使用它,则内容_只是附加到前面的内容,这使得该想法无法很好地发挥作用。有解决办法吗 <div class="block side"> <div class="block_head"> <div class="bheadl"></div> <div class="bhead

我的应用程序中有一大块HTML,我希望将其移动到共享模板中,然后使用content_插入必要的内容。但是,如果我在同一个布局文件中多次使用它,则内容_只是附加到前面的内容,这使得该想法无法很好地发挥作用。有解决办法吗

<div class="block side">
    <div class="block_head">
        <div class="bheadl"></div>
        <div class="bheadr"></div>
        <h2><%= yield :block_head %></h2>
    </div>
    <div class="block_content">
        <%= yield :block_content %>
    </div>
    <div class="bendl"></div>
    <div class="bendr"></div>
</div>

我也可能是完全错误的,如果有更好的方法让内容像这样工作,我想知道。谢谢。

您可以将命名的
内容\u用于
生成
块,如下所示:

视图:


职务
正文

按作者姓名
然后在布局中:

<%= yield :heading %>
<%= yield %>
<%= yield :footer %>

当然,您可以按任何顺序定义它们


文档:

我不确定我是否真的理解了您的问题-以下是一种有效的代码方法:

视图:


测试一
测试二
嗨

application.html.erb

<%= yield :one %>
<%= yield %>
<%= yield :two %>


RailsGuide:

您应该将覆盖内容定义为以下内容(如果我正确理解您的问题):


请注意,如果您的块产生nil,那么旧内容将被保留。但是,整个想法听起来并不好,因为您显然要进行两次渲染(或至少对象实例化)。

您可以直接传递内容,而不依赖于块:

<% content_for :replaced_not_appended %>

在Rails 4中,您可以传递:flush参数来覆盖内容

<%= content_for :block_head, 'hello world', :flush => true %>
true%>
或者,如果你想通过一个街区

<%= content_for :block_head, :flush => true do %>
  hello world
<% end %>
true do%>
你好,世界

参见本助手的更多详细信息

为什么投否决票?原来的问题在我的回答之后被编辑了。它现在包含了更多的细节…这就成功了,谢谢。我确实理解渲染两次的问题,但似乎使用内容和布局比在我需要显示的任何地方粘贴大的HTML块更可取。你不能用简单的部分吗?在某些情况下,我会将大量HTML内容传递到:block\u content yield。我不知道如何使用partials实现这一点。基本上,如果这个HTML是静态的,那么它可能应该进入partial,如果它是动态的,那么应该进入helper。如果您不传递:flush,您还可以使用content_for在一个区域中附加多个代码段。但是您必须不使用,并且使用内容来输出。
<%= yield :one %>
<%= yield %>
<%= yield :two %>
  def overwrite_content_for(name, content = nil, &block)
    content = capture(&block) if block_given?
    @_content_for[name] = content if content
    @_content_for[name] unless content
  end
<% content_for :replaced_not_appended %>
<%= content_for :block_head, 'hello world', :flush => true %>
<%= content_for :block_head, :flush => true do %>
  hello world
<% end %>