28

今日、ビューヘルパー関数「提供」に出くわしました。そのマニュアルを見ると、「content_for」との違いについてまだ混乱しています。

provide(name, content = nil, &block)

content_for と同じですが、ストリーミング フラッシュで使用すると、レイアウトに直接戻ります。つまり、特定のテンプレートをレンダリングするときに同じバッファーに複数回連結したい場合は content_for を使用する必要があります。

質問 1: これは私にとって非常に抽象的です。具体的な例を挙げて具体化できる人はいますか?

質問 2: アセット パイプラインを使用すると、パフォーマンスが向上し、その理由は何ですか?

ありがとう!

4

2 に答える 2

27

そもそもストリーミングとは?なぜあなたはそれを使うのですか?

ストリーミングは、ページをトップダウン (アウトサイド イン) でレンダリングする代替方法です。デフォルトのレンダリング動作は裏返しです。コントローラーでストリーミングを有効にする必要があります。

class MyController
  def action
    render stream: true # Streaming enabled
  end
end

ドキュメントによると:

ストリーミングは、新規作成や編集などの軽量アクションには過剰であると見なされる場合があります。ストリーミングの真の利点は、たとえば、データベースに対して多くのクエリを実行するなど、コストのかかるアクションにあります。

では、ストリーミングを使用していない場合でも、違いはありますか?

はい。

違いは、テンプレートは複数回呼び出すことで複数のコンテンツ ブロックを定義できることです。content_forそうすることで、ブロックが連結され、それがレイアウトに渡されます。

# layout.html.erb
<div class="heading"><%= yield :surprise %></div>
<div class="body">
   <p><%= yield %></p>
   <p>But it's not very interesting...</p>
</div>

# template.html.erb
<%= content_for :surprise, "Hello" %>
I've got your content!
<%= content_for :surprise, ", World!" %>

# Generated HTML
<div class="heading">Hello, World!</div>
<div class="body">
   <p>I've got your content!</p>
   <p>But it's not very interesting...</p>
</div>

provide 提供されたテンプレートの検索を続行しないため、最初のprovide呼び出しに渡されたブロックのみがテンプレートに送信されます。

# layout.html.erb
<div class="heading"><%= yield :title %></div>

# template.html.erb
<%= provide :title, "Foo" %>
<%= provide :title, "bar" %>

# Generated HTML
<div class="heading">Foo</div>
于 2015-09-24T16:13:01.627 に答える
7

違いが何であるかを知りたいと思っていました.Thong KuahがAPIを指摘したように、答えの中:

つまり、レイアウトに yield :title があり、ストリーミングを使用したい場合、タイトルとすべてのアセットをストリーミングする前に、テンプレート全体をレンダリングする (そして最終的にはすべてのクエリをトリガーする) 必要があり、ストリーミングの目的が失われます。このため、Rails 3.1 では provide と呼ばれる新しいヘルパーが導入されています。このヘルパーは content_for と同じことを行いますが、他のエントリの検索を停止してレンダリングを続行するようにレイアウトに指示します。

于 2015-05-05T10:57:24.577 に答える