Rails4ではviewのキャッシュ機構が変わり、何もしなければFragment Cacheに必ずdigestがつくようになりました。
<%= cache "hoge" do %>
<div></div>
<% end %>
このような記述をした場合、Rails4より前では
Rails.cache.read("views/hoge")
# => "<div></div>"
このようにキャッシュのキー名に views/
をprefixとしてつけることで、Rails.cacheの内容に直接アクセスすることができました。
しかし、Rails4からはerb内で <%= cache "hoge" %>
のようにcacheヘルパーを使い、cacheの呼び出し・書き込みをするとdigestが付与されます。
つまり、Rails3までは
views/hoge
というkeyで保存されていたcacheが
views/hoge-○○○○
と言った形で、キーのsuffixとして、一見ランダムな文字列が付け足されるようになりました。
何が問題か
これがどう困るのかというと、controller等で
cached_html = Rails.cache.read("views/hoge")
のようなことができなることです。
解決法
根本的な解決にはなっていませんが、viewで :skip_digest => true
を利用することで、digestを付与しないことができます。
<%= cache "hoge", :skip_digest => true do %>
<div></div>
<% end %>
これによって
cached_html = Rails.cache.read("views/hoge")
のように、 Rails.cache
を利用して、cacheの中身を取得できます。
また、余談ですが、cacheのkeyにつくsuffixは完全にランダムな文字列ではなく、
<%= cache "hoge" do %>
<!-- この部分にsuffixはよって生成される ->
<% end %>
cache
ブロックの中身によって生成されています。
なぜならこのdigest機能の目的は、deployやコードの更新によって、 cache
ブロック中身が変わった際に、昔のcacheを参照しないためにあるからです。
しかし、ブロックの中身からdigestを取得する方法は、残念ですが分かりませんでした。
また、もしかしたら、cacheのキー名からdigestを取得するRailsのAPIがあるかもしれません。誰か教えてください。