質問: Rails で未ログインの場合だけ view をキャッシュする良い方法はありますでしょうか? フラグメントキャッシュでできないかと思い、 Google 検索をしてみましたが、情報が見つからなかったため、質問させていただきました。 具体的な利用シーンとしましては、未ログインでもログイン済みでも同じ表示がされるページがあり、そのページは別にある管理画面からの投稿を10〜20件ほど表示をしていまして、そのページの表示を速くするためにキャッシュを利用したいと考えています。 現在、そのページが表示されるのに約1秒かかっています。(Developer tools にて計測しました。) 正確な数字でないですが、体感的には未ログインの場合のアクセスが7割くらいと思われるので、未ログインの場合だけでも表示を速くできればと考えています。 下記のように if 文で分岐すればできるかと思いますが、できれば HTML は2回書きたくないということと、導入したいページが比較的多く、パーシャルにするのも少々手間なため、さくっと導入できる方法があったりしないかなと思い、質問をさせていただきました。(わがままですみません^^;) ``` - if user_signed_in? %div - # ログイン済みの場合の HTML - else - cache %div - # 未ログインの場合の HTML ``` と、ここまで書いて思ったこととしましては、キャッシュしたい部分をパーシャルにして、上記のように if 文で分岐するのがスマートかなと思いました。
回答: > > キャッシュしたい部分をパーシャルにして、上記のように if 文で分岐するのがスマートかなと思いました。 > > > 以下のように `cache_if` を使用するともう少しスマートになりそうです。 ``` - cache_if user_signed_in?, expires_in: 10.minutes = render hoge ``` > > そのページは別にある管理画面からの投稿を10〜20件ほど表示 > > > どの程度の頻度で管理画面から投稿が追加・修正されるかによって、 `expires_in:` の値を設定すれば、キャッシュによって管理画面から追加・修正した投稿が反映されてない、といった事態を防げるのでさらに良いかと思います。 * 参考: