LoginSignup
2
0

More than 1 year has passed since last update.

【Rails】画面遷移時に前回表示時のキャッシュが一瞬表示される

Posted at

環境

$ 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/1users/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.

つまり、以下のようなことが起きています。

  1. users/randomusers/1にリダイレクト
  2. ここでturbolinksが「users/randomにアクセスがあったらとりあえずusers/1の内容を表示する」と記憶(キャッシュ)する
  3. users/randomにアクセス
  4. 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以外のページも含めて少し表示が遅くなってしまいます。

2
0
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
2
0