Я использую Rails 7. Я хотел создать ссылку с помощью link_to, которая вставляет некоторые настраиваемые поля формы для отношения «многие ко многим» в форму через встроенный фрейм в другом месте страницы. Чтобы настроить сгенерированные поля формы (установить значения по умолчанию и т. д.), мне нужно включить в запрос некоторые настраиваемые параметры:
<%= link_to "Add crew to ship",
new_crew_path(ship_id: ship.id),
data: { turbo_method: :get,
turbo_stream: true } %>
HTML выглядит правильно, но при нажатии на ссылку параметр, кажется, был удален:
<a data-turbo-method = "get" data-turbo-stream = "true" href = "/crews/new?ship_id=1">Add crew to ship</a>
...
Started GET "/crews/new" for 127.0.0.1 at 2023-01-24 13:49:23 +0100
Processing by CrewsController#new as TURBO_STREAM
Если я удалю карту данных, определяющую turbo_stream: true, чтобы она стала обычным запросом, она работает нормально:
<%= link_to "Add crew to ship",
new_crew_path(ship_id: ship.id) %>
Started GET "/crews/new?ship_id=1" for 127.0.0.1 at 2023-01-24 13:53:26 +0100
Processing by CrewsController#new as HTML
Incoming parameters: {"ship_id"=>"1"}
То же самое для изменения его на запрос POST, поэтому вместо этого он переходит к действию #create контроллера, что также работает:
<%= link_to "Add crew to ship",
crews_path(ship_id: ship.id),
data: { turbo_method: :post,
turbo_stream: true } %>
Started POST "/crews?ship_id=1" for 127.0.0.1 at 2023-01-24 13:58:01 +0100
Processing by CrewsController#create as TURBO_STREAM
Incoming parameters: {"ship_id"=>"1"}
Так что у меня есть обходные пути. Тем не менее, из любопытства, есть ли способ заставить турбо-запросы GET отправлять пользовательские параметры? С точки зрения REST это самый правильный метод запроса.





Когда вы добавляете turbo_method: :get, ссылка обрабатывается как форма, и формы GET перезаписывают параметры запроса URL-адреса параметрами формы. В качестве теста:
// app/javascript/application.js
document.addEventListener("turbo:before-fetch-request", (event) => {
console.info(event.target)
})
// you get this "fake" form in the console, that Turbo submits instead of a link:
// <form data-turbo = "true" action = "http://localhost:3000/?ship_id=1" hidden = "" method = "get" data-turbo-stream = ""></form>
Если вы просто измените ссылку на это:
<%= link_to "Add crew to ship",
new_crew_path(ship_id: ship.id),
data: { turbo_stream: true } %>
Теперь это обычная GET-ссылка на турбо-поток, и параметры запроса должны остаться нетронутыми.
Для некоторых дополнительных деталей:
https://github.com/hotwired/turbo/pull/647
стоит подчеркнуть, что объявление
[data-turbo-method = "get"]на<a>элемент является избыточным, и его следует избегать
https://github.com/hotwired/turbo/pull/821
Ах, единственная комбинация, которую я, видимо, не пробовал. Спасибо.