GET リクエストの重複 - Rails と Heroku

概要

Heroku にデプロイされた Ruby on Rails 6 プロジェクトで発生するリクエストの重複を解決する解決策を試みています。

これは、ハイパーリンク付きのアンカーが使用されている場合に発生するようで、2 回ロードされます。

その結果、コントローラーも呼び出すため (GET -> コントローラー -> モデル -> ビュー)、重複したログが生成されてしまいます。

以下は、重複したリクエストを証明するいくつかのログです。

caio-agiani in ~ via ⬢ v14.21.3 took 10m 37s ❯ heroku logs -a levante-web -t | grep 2804:7f0:b8c2:13f:8755:4a1e:74b8:x735,172.71.10.17          
2024-03-31T02:32:36.318790+00:00 heroku[router]: at=info method=GET path="/levante/search?query=caioagiani" host=app request_id=3e84b5d5-b478-41aa-b1e8-218838f37ca1 fwd="2804:7f0:b8c2:13f:8755:4a1e:74b8:x735,172.71.10.17" dyno=web.1 connect=0ms service=426ms status=200 bytes=12075 protocol=https
2024-03-31T02:32:57.648033+00:00 heroku[router]: at=info method=GET path="/levante/search?query=caioagiani" host=app request_id=f17c6635-3541-4153-8283-3811659ff00a fwd="2804:7f0:b8c2:13f:8755:4a1e:74b8:x735,172.71.10.17" dyno=web.1 connect=0ms service=330ms status=200 bytes=12077 protocol=https
2024-03-31T02:33:01.813927+00:00 heroku[router]: at=info method=GET path="/levante/shop/index" host=app request_id=cc5dd643-41c3-45e9-bffa-a73ed617d0b0 fwd="2804:7f0:b8c2:13f:8755:4a1e:74b8:x735,172.71.10.17" dyno=web.1 connect=0ms service=42ms status=200 bytes=25575 protocol=https
2024-03-31T02:33:02.145246+00:00 heroku[router]: at=info method=GET path="/levante/shop/index" host=app request_id=7bdfadad-273e-4b8a-ab88-4f0422ececaf fwd="2804:7f0:b8c2:13f:8755:4a1e:74b8:x735,172.71.10.17" dyno=web.1 connect=0ms service=39ms status=200 bytes=25564 protocol=https

PS: これは Turbolink/Load または ujs などの内部 Rails スクリプトにリンクされている可能性がありますか?全く同じセットアップを使用する実稼働環境の別のアプリケーションがあるため、そのとおりであるという証拠があります。ただし、1 つは従来の Rails ネイティブ インポート スクリプトと CSS テンプレート (javascript_include_tag、javascript_pack_tag、stylesheet_pack_tag) を使用し、もう 1 つは単純な HTML メタ タグを使用します。

解決策

そうですね、これは実際にはターボリンクによるもので、基本的に data-turbolinks-track を挿入してリロードするセクションがありました [スクリーンショット]。

このピクセル スクリプトのスニペットには運用環境のチェックが含まれていたため、この問題はローカルでは発生しませんでした。

data-turbolinks-track のリロードを維持することもできますが、アンカー要素に data-turbolinks=false を追加する必要があります。

= link_to "Comprar", levante_checkout_offer_path(offer), class: "btn button-primary", data: { turbolinks: "false" }
$(document).on("turbolinks:load", () => {
  $("a").attr("data-turbolinks", "false");
});