9

アプリケーションにHTMLの大きなブロックがあり、共有テンプレートに移動してから、content_forとyieldsを使用して必要なコンテンツを挿入します。ただし、同じレイアウトファイルで複数回使用すると、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" %>

問題は、同じレイアウトでこれを複数回使用すると、元のブロックのコンテンツが2番目のブロックに追加されることです。

それを回避するためにカスタムヘルパーメソッドを作成しようとしましたが、コンテンツが返されません

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

cf. 詳細については、このヘルパーのソースコードを参照してください

于 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の場合、古いコンテンツが保持されることに注意してください。ただし、明らかにいくつかのレンダリング(または少なくともオブジェクトのインスタンス化)を2回実行しているため、アイデア全体は適切に聞こえません。

于 2011-04-17T18:18:21.060 に答える
2

ブロックに依存せずに、いつでもコンテンツを直接渡すことができます。

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

私があなたの質問を本当に理解しているかどうかはわかりません-これが機能するコードの1つのアプローチです:

見る:

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

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

<p>Hi</p>

application.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_forとブロックを使用できます。yield

意見:

<% 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 に答える