caches_action と :layout => false で無視された content_for ブロックの回避策はありますか? 質問する

caches_action と :layout => false で無視された content_for ブロックの回避策はありますか? 質問する

Rails 3 で使用するとcaches_action :layout => false、キャッシュされたビューに入力され、レイアウトで使用される content_for ブロックはすべて空になります。これを回避する方法はありますか?

たとえば、私のアプリケーションでは、次のような典型的な設定になっています。

ビューから呼び出され、ページ タイトルを設定するヘルパー メソッド:

# application_helper.rb
def page_title(title)
    content_for(:page_title) { title }
end

レイアウトファイル内の次の行

# application.html.erb
<head>
<title><%= yield(:page_title) %></title>
</head>

そして私が言う見方では

# index.html
<% page_title 'Hello!' %>

もちろん、 でアクションをキャッシュすると:layout => false、アクション キャッシュはすべての content_for ブロックを無視するため、ページ タイトルが空白になります。

これを回避する方法はありませんか? アクション キャッシュは:layout => false非常に便利なものになりつつありますが、この不具合により非常に扱いにくくなっています。

同じ問題について質問したりコメントしている他の人:

  1. http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/d8d72f050701d44b
  2. http://www.golygon.com/2011/04/tips-and-tricks-in-ruby-on-rails/
  3. https://rails.lighthouseapp.com/projects/8994/tickets/4140-action-caching-with-caches_action-and-layout-false

そしてそのRailsドキュメントこの動作を指摘します:

「警告: content_for はキャッシュでは無視されます。したがって、フラグメント キャッシュされる要素には使用しないでください。」

ベストアンサー1

これを回避する方法は、content_for の設定に依存するヘッダー部分のフラグメント キャッシュを作成することだったと思います。

つまり、次のようになります。

# application.html.erb
<head>
<% cache("#{request.env['PATH_INFO']}/header") do %>
    <title><%= yield(:page_title) %></title> 
<% end %>

したがって、このキャッシュされたフラグメントは、アクションがキャッシュされると同時に設定される必要があります。

おすすめ記事