LoginSignup
13
10

More than 5 years have passed since last update.

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

Posted at

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

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10