Дублирующиеся запросы GET — Rails и Heroku

Я пытаюсь решить проблему дублирования запросов, происходящего в моем проекте Ruby on Rails 6, развернутом в Heroku.

Кажется, это происходит, когда используются якоря с гиперссылками, поэтому он загружается в 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 или каким-то внутренним скриптом Rails, например ujs? У меня есть доказательства того, что да, поскольку у меня есть другое приложение в производстве, использующее точно такую ​​​​же настройку, однако одно использует обычные сценарии импорта Rails и шаблон CSS (javascript_include_tag, javascript_pack_tag, stylesheet_pack_tag), а другое использует простые метатеги HTML.

  • Я уже тестировал это в локальной среде, и этого не происходит.
  • Я видел несколько комментариев о Serviceworker, но не подтвердил их на 100%.
  • Конфигурации Loadbalance/Nginx нет. Прямая среда между Heroku с Node/Ruby Buildpacks и проектом RoR.

Здесь вам предстоит еще немного отладки. Первый — попробовать отправить запрос с помощью cURL или почтальона, чтобы проверить, не на стороне ли проблема сервера.

max 01.04.2024 11:42

Если вы затем сузили проблему до проблемы с JavaScript, проверьте ресурсы, загруженные в браузер. CSS не имеет значения, поскольку он не меняет поведение браузера.

max 01.04.2024 11:46

Я смог сделать вывод, что проблема заключается в javascript, выполнив тот же проект без использования стандартного html-заголовка Rails. Двойственность возникает только при нажатии на гиперссылку привязки, например «панель навигации» или «кнопка»; При нажатии на эти элементы в конечном итоге генерируются 2 запроса, дублирующие весь процесс бизнес-правила на обратной стороне, включая создание дополнительных журналов в базе данных. Вам нужны доказательства, чтобы помочь? У меня дискорд, я могу предоставить вам доступ, ищите меня на @caioagiani.

Caio Agiani 02.04.2024 19:11

Найдите одну из этих якорных ссылок в инспекторе вашего браузера. Это во вкладке «Элементы». Справа должна быть вкладка под названием «Прослушиватели событий». Найдите событие щелчка, и оно покажет вам все файлы, в которых регистрируется прослушиватель событий. Turbolinks регистрирует его в документе.

max 02.04.2024 19:20

рельсы ujs, турболинки и бутстрап распечатайте, я думаю, что любой из них должен конфликтовать/дублироваться

Caio Agiani 02.04.2024 19:32

Обработчики Rails UJS должны срабатывать только на ссылках с атрибутами data-method и data-confirm. Turbolinks мог бы сделать это, если бы он был загружен дважды.

max 02.04.2024 19:35

Да, UJS должен работать только для этих гиперссылок, например, для публикации выхода из системы. Я буду отлаживать эти события и пытаться заблокировать эти события, чтобы определить причину проблемы! хаха

Caio Agiani 02.04.2024 19:46

Ну, на самом деле это произошло из-за турболинков, в основном там был раздел для добавления data-turbolinks-track, reload[скриншот]. Ваш комментарий помог мне вспомнить, что этот фрагмент кода и некоторые скрипты не загружаются в локальной среде, поэтому вскоре мне удалось найти источник, вызывающий проблему. В любом случае, большое спасибо!

Caio Agiani 02.04.2024 21:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну, на самом деле это произошло из-за турболинков, в основном там был раздел, в который можно было вставить data-turbolinks-track, reload [скриншот].

Эта проблема также не возникла локально, потому что фрагмент этого пиксельного скрипта имел проверку на среду production.

Также можно сохранить перезагрузку 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");
});

Другие вопросы по теме