4

同じページに2回レンダリングしている部分がありますが、2つの異なる場所にあります(1つは標準レイアウトで表示され、もう1つはモバイル/タブレットレイアウトで表示されます)。

パーシャルは両方の場所でまったく同じようにレンダリングされるので、可能であれば変数として保存することでスピードを上げたいと思います。パーシャルは毎回API呼び出しを行い、2番目の呼び出しは最初のAPI呼び出しと重複しているため、完全に不要です。

返されたパーシャルからのHTMLを変数として保存し、それを両方のレンダリングに使用する方法はありますか?

編集:これは非常に単純なニーズであり、コードベースを無駄のない読みやすいものに保つことを目指しているため、キャッシュなしでこれを実行したいと考えています。パーシャルを文字列変数として保存し、それを2回参照することは可能ですか?

4

3 に答える 3

8
<% content_for :example do %>
  <%= render :your_partial %>
<%end%>

次に、<%= yield :example %>または<%= content_for :example %>部分的に呼び出したい場所に電話します。

于 2012-07-19T05:58:12.490 に答える
6

1つのオプションは、フラグメントキャッシングを使用することです。パーシャルをキャッシュブロックでラップした後、2番目の呼び出しで最初の呼び出しのキャッシュバージョンが表示されます。例えば:

<% cache do %>
  <%= render(:partial => 'my_partial') %>
<% end %>

... later in the same view ...

<% cache do %>
  <%= render(:partial => 'my_partial') %>
<% end %>

render_to_stringレンダリングの結果を文字列に保存するには、のメソッドを試すことができますAbstractController。引数は。の場合と同じですrender

partial_string = render_to_string(:partial => 'my_partial')
于 2012-07-19T03:25:36.207 に答える
1

この古い質問への回答を追加します。これは、私が行ったばかりの検索でGoogleを上回ったためです。

これを今(かなり長い間)行う別の方法、キャプチャヘルパーがあります。

<% reuse_my_partial = capture do %>
  <%= render partial: "your_partial" %>
<% end %>

<div class="visible-on-desktop"
  <%= reuse_my_partial %>
</div>

<div class="visible-on-mobile"
  <%= reuse_my_partial %>
</div>

これは、content_forを使用するよりも簡単で、わずかに安全です。これは、他の何かが変更する可能性のあるグローバルストレージが含まれていないためです。

Railsのドキュメントは、レイアウトテンプレートで使用できるようにするために、ローカル変数の代わりにインスタンス@varsを使用するようにリンクされています。これは、同じテンプレートファイルで使用しているため、心配する必要のない詳細です。

于 2019-01-19T14:55:03.107 に答える