9

我的应用程序中有大块 HTML,我想将其移动到共享模板中,然后使用 content_for 和 yield 来插入必要的内容。但是,如果我在同一个布局文件中多次使用它, content_for 只会附加到前一个文件中,从而使该想法无法很好地发挥作用。有针对这个的解决方法吗?

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

我使用以下代码设置块的内容

    <%= overwrite_content_for :block_head do -%>
        My Block
    <% end -%>
    <%= overwrite_content_for :block_content do -%>
        <p>My Block Content</p>
    <% end -%>
    <%= render :file => "shared/_blockside" %>

问题是如果我在同一个布局上多次使用它,原始块中的内容将附加到辅助块

我尝试创建一个自定义帮助方法来解决它,但是它不返回任何内容

  def overwrite_content_for(name, content = nil, &block)
    @_content_for[name] = ""
    content_for(name, content &block)
  end

我也可能会完全错误地解决这个问题,如果有任何更好的方法可以让内容像这样工作,我想知道。谢谢。

4

5 回答 5

18

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

<%= content_for :block_head, 'hello world', :flush => true %>

或者,如果你想通过一个块,

<%= content_for :block_head, :flush => true do %>
  hello world
<% end %>

参看。此助手的源代码以获取更多详细信息

于 2013-12-19T18:05:25.400 回答
2

您应该将您的 overwrite_content_for 定义如下(如果我正确理解您的问题):

  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

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

于 2011-04-17T18:18:21.060 回答
2

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

<% content_for :replaced_not_appended %>
于 2012-10-30T18:34:48.160 回答
1

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

看法:

<% content_for :one do %>
  Test one
<% end %>

<% content_for :two do %>
  Test two
<% end %>

<p>Hi</p>

应用程序.html.erb

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

Railsguides:http ://guides.rubyonrails.org/layouts_and_rendering.html#using-content_for

于 2011-04-12T06:52:21.383 回答
-1

您可以像这样使用命名content_foryield块:

看法:

<% content_for :heading do %>
  <h1>Title of post</h1>
<% end %>

<p>Body text</p>

<% content_for :footer do %>
  <cite>By Author Name</cite>
<% end %>

然后在布局中:

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

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

文档:http ://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html

于 2011-04-12T06:51:47.090 回答