Ответы на формы должны быть перенаправлены в другое место с помощью link_to

#ruby-on-rails #hotwire-rails

Вопрос:

Я использую rails 6.1.x с горячими проводными рельсами

Мне было интересно, испытывали ли вы когда-нибудь следующее:

У меня есть страница, где у меня есть ссылка на что-то подобное:

 <%= link_to client_luser_courses_path,
{
  method: :get,
  class: "btn btn-primary text-center float-right",
  data: {turbo: false}
 } do %>
 <i class="fa fa-arrow-right" aria-hidden="true"></i>Get the files:
 <% end %>
 

В верхней части страницы я включаю турбо с:

<%= javascript_pack_tag «клиент», «турбо-трек данных»: «перезагрузка» %>

Теперь, если я нажму на ссылку, я получу сообщение об ошибке:

«Ошибка: ответы на формы должны быть перенаправлены в другое место» в консоли Firefox

и ничего не происходит.

Если я удалю часть «метод: :получить», то она будет работать нормально.

  <%= link_to client_luser_courses_path,
    {
      class: "btn btn-primary text-center float-right",
      data: {turbo: false}
     } do %>
     <i class="fa fa-arrow-right" aria-hidden="true"></i>Get the files:
     <% end %>
 

Вы знаете, почему это происходит? Это действительно озадачивает.

Комментарии:

1. Добавление method: :get в первую очередь бессмысленно, так как ссылки всегда отправляют запросы GET. Вот как работают веб-браузеры. data-method Обработчик в ненавязчивом драйвере Javascript Rails (rails-ujs) предназначен для улучшения поведения ссылок, позволяя отправлять сообщения, ИСПРАВЛЯТЬ и УДАЛЯТЬ, которые не являются идемпотентными методами. Это достигается путем динамического создания формы с помощью JS и ее отправки.

2. @макс, спасибо тебе. Да, теперь я понял, что добавлять метод get излишне.

Ответ №1:

Просто чтобы уточнить информацию из комментариев, тем более, что, похоже, существует много путаницы вокруг ссылок в Hotwire/Turbo:

  1. Если вы хотите, чтобы ссылка вела себя «по умолчанию» (это означает, что вам требуется новая страница / полная перезагрузка страницы), OP правильно data: { turbo: false } указал на ссылке.
  2. Комментатор макс прав в том, что добавление method: :get не требуется для того, чтобы ссылка вела себя таким образом. Однако важно отметить, что причина сбоя заключается в том, что добавление method параметра фактически заставляет ссылку отправлять запрос на публикацию со скрытым вводом с именем «_method» и значением «get». Смотрите link_to в документах API Rails.
  3. Сообщение об ошибке, которое видит ОП, на самом деле является ошибкой Турбо. Неясно, ошибка это или нет, так как Турбо должен быть отключен. Это должно быть так, что сетевой запрос выполняется успешно, но не перенаправляется, потому что Turbo взял верх. Причина, по которой в конечном итоге происходит сбой, заключается в том, что Turbo (ошибочно?) обрабатываю запрос и ожидаю 30-кратного перенаправления, но перенаправления не происходит. Вот почему в конечном итоге происходит сбой. Если вы откроете свой сетевой инспектор в DevTools, вы увидите запрос на 200 с предварительным просмотром страницы, на которую вы ссылаетесь.

TLDR: Добавление method: :get заставляет ссылку отправлять запрос на публикацию, и, вероятно, именно поэтому Turbo берет на себя управление, несмотря на то, что OP ввел data: { turbo: false } .

Комментарии:

1. Да, спасибо. Мне было интересно,почему я получаю эту ошибку, хотя я думал, что метод: :get приведет к запросу get, а не к запросу post. Очень хорошо объяснено. Спасибо. Я закладываю это в закладки.