14

<%= render %>誰かが " " と " <%= yield %>/ <% content_for :partial do %>"の違いを説明できますか<% end %>? 具体的には、あるものから別のものに切り替えるときにルーティングがどのように変化するか、一方を他方よりも優先して使用する利点、一方を他方よりも優先して使用することが実際的な場合です。これは私が見つけた最も近い説明ですが、私には十分に明確ではありません。

私はこれに頭を悩ませようと数日間試みてきましたが、試した各構成は近づくか、エラーになるようです。

ととの3 つのビューがaaaあり、それぞれにがあり、部分 (アンダースコアで示されます) がある場合、または のいずれかを使用して、または部分を取得するにはどうすればよいですか?bbbcccindex.html.erbbbbccc_content.html.erbbbbcccaaarenderyield

以下の作品:

aaaの index.html.erb :

<div">
  <%= render 'bbb/content' %>
</div>

s _content.html bbb/erb :

<p>Content from bbb.</p>  

しかし、これはしません:

aaaの index.html.erb :

<div">
  <%= yield :container %>
</div>

s _content.html bbb/erb :

<% content_for :container do %>
  <p>Content from bbb.</p>   ### viewed in aaa
<% end>

cccs _content.html.erb には何もないか、または がありますがcontent_for、それでもaaaの index.html にコンテンツが入力されません。

レンダーを使用すると、コンテンツを明示的に配置できます。ただし、を使用する利点により、yield :whatever何を入力するかを選択できるようになり、変更するとすぐに何かを入力することはできません。レンダリングから生成まで。ルートファイルも更新する必要がありますか? もしそうなら、どのように入力するかを選択するにはどうすればよいですか? それはコントローラーにあるということですか?アクションが必要ですか?

また、最初にルーティングされるファイルに依存することもありますが、前述したように、パーシャルを有利に使用する前に、2 つの違いを理解する必要があると思います。

4

3 に答える 3

11

まず、yieldはruby、renderはrailsです。通常、アクション/コンテキストに応じて内部コンテンツが変化するアプリケーションに共通のレイアウトを使用します。問題は通常、レイアウトが終了し、コンテキスト固有のテンプレートが開始する場所を定義することにあります。たとえば、HTMLタイトルタグを考えてみましょう。Citiesというアプリケーションがあるとしましょう。ほとんどの場合、ページタイトルは常に「都市」にする必要があります。ただし、たとえばアムステルダムのページ内にいる場合は、ページタイトルとして「アムステルダム」を使用する必要があります。

# application.html.erb
<html>
  <head>
    <%= content_for?(:page_title) ? yield(:page_title) : "Cities" %>
    ......

# city/index.html.erb
<% content_for :page_title do %>
  <%= @city.name %> 
<% end %>

<div class="bla"...

Rails内では、通常、アプリケーションレイアウトでアプリケーションタイトルを定義します。ページタイトルを変更するための1つの戦略は、特定の都市テンプレートでcontent_forを使用し、それに応じて変更することです。

一方、レンダリングはさまざまなレンダリング戦略を実現します。真っ直ぐ。renderを呼び出すと、レンダリングされます。content_for / yieldは自動的にレンダリングされず、どこかに保存されてから、適切な場所で欠落しているスポットを埋めます。したがって、単なるレンダリングであるレンダリングと比較すると、「ストア/検索/置換」と考えることができます。

経験則として、どちらか一方を使用することをお勧めします。作成するテンプレートでコンテキストごとに異なる情報を表示する必要がある場合は、content_forの使用を強く検討してください。

于 2013-01-17T11:05:31.743 に答える
5

yield

Ruby コード (Proc クラス) であり、ブロックを受け取り、そのブロックで行うべきことを実行します。Yield は、同じことを行う他の Ruby ベースの方法と比べても高速です。私はそれをレイアウトで使用すると思います (そして、私はそれを使用するだけです)。yieldレイアウト内の特定の場所にコンテンツを渡すためにも使用されます。<%= yield :head %>head タグのすぐ上にあることがよくあります。

一般的な用途:

  • ほとんどの場合、レイアウトでのみ使用されます
  • (モデルでそうする気がある/する傾向がある場合)真のRuby Procステートメントとして。

render

ドキュメントが言うように、引数を渡すRailsコードは、「ブラウザに返されるコンテンツをレスポンスボディとしてレンダリングします」。パーシャル、アクション、テキスト、ファイルなど。

一般的な用途:

ビューとコントローラーの両方で使用されます。

于 2013-01-17T11:39:23.810 に答える
1

コントローラー メソッドが終了すると、関連付けられたファイルがレンダリングされます。したがって、編集コントローラーは edit.html.erb をレンダリングします。何も指定されていない場合は、指定されたレイアウトまたは application.html.erb が使用されます。

レイアウト ファイル内で呼び出すyieldと、レンダリングからの情報が入力されます。パラメータを指定して呼び出すと、レンダリング ファイル内でそのパラメータに一致するセクションyieldが検索されます。content_for完全にはわかりませんが、レイアウト ファイルの外部から呼び出すことはできないyieldと思います。また、レンダリング ファイルにある情報以外の情報が入力されるとは思いません。

レイアウト ファイルまたはレンダリングされたファイルのどこでもrender、部分名からアンダースコアを引いたものを呼び出すことで、部分をレンダリングできます。

それが役立つことを願っています。

コメントで質問に答えるように編集します。

yieldrender同様の機能を実行yieldしますが、レンダリング ファイルのみを検索し、レンダリングするファイルrenderを指定します。また、renderファイル全体を出力しますがyield、パラメーターを使用すると、ファイルのサブセクションのみを出力できます。

于 2013-01-17T06:17:43.083 に答える