Hotwire/Turbo Frames: почему target: "_top" не запрашивает страницы через выборку?

Я нахожусь на ранних этапах переноса приложения Rails из Turbolinks/rails-ujs (используя старый добрый js.erbпросмотры, которые творили чудеса) на Hotwire/Turbo.

Представьте себе традиционный users/index.html.erbстраница с формой поиска и таблицей результатов:

      <%= form_with(scope: :search, url: url_for, method: :get, data: { turbo_frame: "users_table" }) do |f| %>

  <%= f.search_field :name %>

<% end %>

<%= turbo_frame_tag("users_table") do %>
  
  <% @users.each do |user| %>
    <%= link_to user.name, user, target: :_top %>
  <% end %>

  <%== pagy_bootstrap_nav(@pagy) %>

<% end %>

Таким образом, приведенная выше форма поиска может обновлять приведенный ниже turbo_frame_tag без полной перезагрузки страницы (что сохраняет фокус и состояние в форме по желанию).

Ожидается, что каждая ссылка внутри turbo_frame_tag ведет к /users/show, заменяя собой всю страницу. И это работает, благодаря включению target: :_topатрибут в каждой ссылке.

Однако страдает пользовательский опыт. С Turbolinks каждая ссылка внутри таблицы users_table выполняла навигацию AJAX, заменяя «тело» и ощущалась очень, очень быстрой. С Turbo/Hotwire я вижу в devtools, что только разбивка на страницы (внутри турбо-фрейма) и отправка формы (из-за атрибута turbo_frame) извлекаются с использованием fetch, а ссылка в имени пользователя запрашивается как обычная documentнавигация.

Дело обстоит еще хуже: кнопка «Назад» также не имеет кеша, поэтому нажатие на имя пользователя и возврат занимает в 5 раз больше времени, чем с Turbolinks.

Это ожидаемая регрессия при использовании Turbo? Каждый раз, когда у меня есть ссылка внутри turbo_frame, которую я хочу вырвать за пределы фрейма, я теряю все преимущества навигации ajax?

1 ответ

Решение найдено.

Вместо

      <%= link_to user.name, user, target: :_top %>

Следует использовать

      <%= link_to user.name, user, data: { turbo_frame: :_top } %>
Другие вопросы по тегам