Turbo_stream format not being sent anymore

5.9k views Asked by At

we are currently working on changing our web app search engine from Stimulus to Turbo.

However, we keep getting an HTML request instead of a Turbo one from our script with the error : “

ActionController::UnknownFormat “.
Trying to force the request into the Turbo format give the following error :
“ ActionController::UnknownFormat - SearchController#search is missing a template for this request format and variant.
request.formats: ["text/html"]
request.variant: []: “

We are on the 7.0.0-beta.5 Turbo version.

View

<h1>All Apps</h1>
<%= turbo_frame_tag "record" do %>
  <%= form_with url: "/search", method: :get , data: { controller: "search" }  do |form| %>
    <%= form.text_field :search , data: { action: "input->search#findResults" } %>
  <% end %>
<% end %>
<%= turbo_frame_tag "apps" do %>
  <ul>
    <% @apps.each do |app| %>
      <%= content_tag :li, app.name %>
    <% end %>
  </ul>
<% end %>

<turbo-stream action="update" target="apps">
  <template>
    <ul>
      <% @apps.each do |app| %>
        <%= content_tag :li, app.name %>
      <% end %>
    </ul>
  </template>
</turbo-stream>

class SearchController < ApplicationController
  def search
    @apps = ItunesConnect::App.where("name like ?", "#{params[:search]}%")
    respond_to do |format|
       format.turbo_stream
       #format.html  { redirect_to root_url(search: params[:search]) } #for testing
    end
  end
end

Any advises ?

3

There are 3 answers

0
aidan On

I may have just had a similar problem. I think you need to specify format: :turbo_stream as one of your options to form_with. In my case, I wanted to hit the HTML block but the form kept hitting turbo_stream instead.

To be extra clear, this

<%= form_with url: "/search", method: :get , data: { controller: "search" }  do |form| %>

becomes this

<%= form_with url: "/search", method: :get , data: { controller: "search" }, format: :turbo_stream  do |form| %>
2
David Morales On

When defining a route manually with get, for example, you should specify the default format like this:

get :search, to: 'search#index', defaults: { format: :turbo_stream }
1
RedZagogulin On

Just encounter the very same problem: form with method: :get does not send a request with TURBO_STREAM format (it is HTML).

Aidan's answer is almost correct - format: :turbo_stream should be specified explicitly. It should not be an argument's hash element but a URL's parameter, like this:

<%= form_with URL: search_path(format: :turbo_stream), method: :get , data: { controller: "search" } do |form| %>