環境
$ ruby -v
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin19]
$ rails -v
Rails 6.1.3.2
起こった問題
user
のshowページをランダムで表示するUsersController/random
アクションがあり、users/random
にルーティングされています。
def random
user = User.find(User.pluck(:id).sample)
redirect_to user
end
users/random
にアクセスすると、users/1
やusers/2
にランダムで飛ぶのですが、その際に、前回users/random
で飛んだページが一瞬表示されます(アドレスバーはusers/random
)。
原因
Railsでデフォルトで有効になっているturbolinksのしわざです。
turbolinks/turbolinks: Turbolinks makes navigating your web application faster
If possible, Turbolinks will render a preview of the page from cache immediately after the visit starts.
つまり、以下のようなことが起きています。
-
users/random
→users/1
にリダイレクト
- ここでturbolinksが「
users/random
にアクセスがあったらとりあえずusers/1
の内容を表示する」と記憶(キャッシュ)する -
users/random
にアクセス -
users/2
にリダイレクトすることになったけど、処理が終わるまでturbolinksがキャッシュしておいたusers/1
の内容を表示する
こう直す
対処法も、上記リンクの「Opting Out of Caching」の項に書いてあります。
<head>
...
<meta name="turbolinks-cache-control" content="no-preview">
</head>
これでキャッシュプレビュー機能が無効になり、タイトルの問題は解消されます。
no-cache
にするとキャッシュ機能自体が無効になりますが、no-preview
だとプレビュー機能だけが無効になり、戻る、進むでの遷移時にはキャッシュが使われます。
もちろんその分、/users/random
以外のページも含めて少し表示が遅くなってしまいます。