条件が失敗した場合、ERBビュー内の名前付きフラグメントのキャッシュ書き込みをキャンセルする簡単で効率的な方法を探しています。Rails(ERB):条件が失敗した場合にフラグメントキャッシュをキャンセルできますか?
私は現在、これをやっている:
<% cache("header_#{$I18n.locale}", expires_in: 1.day) do %>
<% begin %>
<%= raw open("https://mywebsite.org/remote/fragment", :read_timeout => 10).read %>
<% rescue OpenURI::HTTPError => e %>
Error Loading Remote File: <%= e.message %>
<% end %>
<% end %>
明らかにこれのいくつかは、生産コードのためのベストプラクティスを表示しないように、ちょうど私の問題を実証することです。
ここに問題があります:上記のエラーメッセージがキャッシュされ、次回のロード時にサーバーを再試行するのではなく、1日間表示されます。
(通常、これはビューでは起こっていないだろうが、この場合には、私は大きなレールのアプリのためのプラグインを書いていると、コントローラ、ちょうどビューを変更することはできません。)
です私は何をしたいのですが:
<% cache("header_#{$I18n.locale}", expires_in: 1.day) do %>
<% begin %>
<%= raw open("https://mywebsite.org/remote/fragment", :read_timeout => 10).read %>
<% rescue OpenURI::HTTPError => e %>
--> Some command to cancel the cache action started above
--> Show a backup something to the user (I'll provide)
<% end %>
<% end %>
誰もがこれを行う方法についての提案を持っていますか?
私はこれに完全な答えを得る時間がありませんが、私の2つの提案は、a) 'cache'呼び出しを_inside_' begin'ブロックに置きます。そうすると例外が発生し、 'cache'必要に応じて、['expire_fragment'メソッド(http://edgeapi.rubyonrails.org/classes/ActionController/Caching/Fragments.html#method-i-expire_fragment)も使用してください。 – philomory
@philomory私のテストでは、キャッシュブロックをbeginブロック内に置くことをお勧めします。これを正解とすることができますか? –