Rails: турбо-кадр с запрошенным src интерпретируется как format.html

Я заметил это странное поведение ленивой загрузки турбо-кадров через src настройка атрибута:

      nav
  = turbo_frame_tag 'primary_menu', src: primary_menu_path
        : def primary_menu
  :   respond_to do |format|
  :     format.turbo_stream
> :     format.html { binding.pry ; render plain: 'should not reach this block' }
  :   end
  : end

)> turbo_frame_request?
=> true

По какой-то причине он интерпретируется как обычный запрошенный html-запрос, хотя turbo_frame_request? возвращает => true. Что вызывает это и как это исправить?

PS primary_menu.turbo_stream.slim существует для этого действия контроллера.

Локальные версии:

hotwire-rails 0.1.3 @hotwired/turbo-rails 7.0.0-beta.5

2 ответа

Before someone with better knowledge of turbo internals explains it properly, below is a method that worked for me:

      <%= turbo_frame_tag 'primary_menu', src: primary_menu_path %>

Would be interpreted as HTML request:

      def primary_menu
  # load your thing

  respond_to do |format|
    format.html
  end
end

in your primary_menu.html.erb make sure you wrap your content with <%= turbo_frame_tag 'primary_menu' do %> block.

Keep in mind that:

  • names have to match here and its original definition/require.
  • any additional turbo_frame_tag wrapped blocks in that response would be silently ignored.

Это ожидаемое поведение, как указано в документации Turbo.

По умолчанию Turbo не добавляет тип MIME text/vnd.turbo-stream.html при отправке ссылок или форм с типом метода GET.

Чтобы переопределить это поведение:

Чтобы использовать ответы Turbo Streams с запросами GET в приложении, вы можете указать Turbo включить тип MIME, добавив атрибут data-turbo-stream в ссылку или форму.

также есть ответ Здесь

Причина этого в том, что для запросов GET более разумно использовать турбо- кадр , а не потоковую передачу .

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