Я пытаюсь решить проблему дублирования запросов, происходящего в моем проекте 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.
Если вы затем сузили проблему до проблемы с JavaScript, проверьте ресурсы, загруженные в браузер. CSS не имеет значения, поскольку он не меняет поведение браузера.
Я смог сделать вывод, что проблема заключается в javascript, выполнив тот же проект без использования стандартного html-заголовка Rails. Двойственность возникает только при нажатии на гиперссылку привязки, например «панель навигации» или «кнопка»; При нажатии на эти элементы в конечном итоге генерируются 2 запроса, дублирующие весь процесс бизнес-правила на обратной стороне, включая создание дополнительных журналов в базе данных. Вам нужны доказательства, чтобы помочь? У меня дискорд, я могу предоставить вам доступ, ищите меня на @caioagiani.
Найдите одну из этих якорных ссылок в инспекторе вашего браузера. Это во вкладке «Элементы». Справа должна быть вкладка под названием «Прослушиватели событий». Найдите событие щелчка, и оно покажет вам все файлы, в которых регистрируется прослушиватель событий. Turbolinks регистрирует его в документе.
рельсы ujs, турболинки и бутстрап распечатайте, я думаю, что любой из них должен конфликтовать/дублироваться
Обработчики Rails UJS должны срабатывать только на ссылках с атрибутами data-method и data-confirm. Turbolinks мог бы сделать это, если бы он был загружен дважды.
Да, UJS должен работать только для этих гиперссылок, например, для публикации выхода из системы. Я буду отлаживать эти события и пытаться заблокировать эти события, чтобы определить причину проблемы! хаха
Ну, на самом деле это произошло из-за турболинков, в основном там был раздел для добавления data-turbolinks-track, reload[скриншот]. Ваш комментарий помог мне вспомнить, что этот фрагмент кода и некоторые скрипты не загружаются в локальной среде, поэтому вскоре мне удалось найти источник, вызывающий проблему. В любом случае, большое спасибо!





Ну, на самом деле это произошло из-за турболинков, в основном там был раздел, в который можно было вставить 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");
});
Здесь вам предстоит еще немного отладки. Первый — попробовать отправить запрос с помощью cURL или почтальона, чтобы проверить, не на стороне ли проблема сервера.