Rails
rails3
Rails4

Rails4だとviewのcacheに直接アクセスできない

More than 5 years have passed since last update.

Rails4ではviewのキャッシュ機構が変わり、何もしなければFragment Cacheに必ずdigestがつくようになりました。


hoge.html.erb

<%= cache "hoge" do %>

<div></div>
<% end %>

このような記述をした場合、Rails4より前では


hoge.rb

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を付与しないことができます。


hoge.html.erb

<%= 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があるかもしれません。誰か教えてください。