'Error: Form responses must redirect to another location

I need to render an html code I receive from an API.

In Rails 6 : I was doing this in my controller, and it was working fine. I called the webservice I received the response, and I was redirected to the code generated by the render. Fine !

class GatewayController < ApplicationController
  def new
    init_gateway_call
  end

  def create
    call_gateway
    render_gateway_response
  end

  private

  ...

  def render_gateway_response
    render(html: @gateway_response.message.html_safe)
  end
end

new.html.erb :

<%= form_with url: gateway_path, local: true do |f| %>
  ...
<% end %>

And no : create.html.erb

** Rails 7 **

I call the webservice. I get the answer but my page idle and I get this error.

Error: Form responses must redirect to another location at FormSubmission.requestSucceededWithResponse (application-0f0c10fb8f5683e32fc53a93a8a323c328de61682ca16fb65a6a2b8a3ba5d087.js:1614) at FetchRequest.receive (application-0f0c10fb8f5683e32fc53a93a8a323c328de61682ca16fb65a6a2b8a3ba5d087.js:1390) at FetchRequest.perform (application-0f0c10fb8f5683e32fc53a93a8a323c328de61682ca16fb65a6a2b8a3ba5d087.js:1374)

So far, I tried:

# GatewayController
respond_to :create, format: :html, gateway_response: @gateway_response.message.html_safe
<%= gateway_response %>

Without success ... Do you have any idea? Otherwise it is going to be a long weekend ^^



Solution 1:[1]

I figured it out you while posting my question. The error message seems like a Turbo error. I had to had data-turbo false to my form.

<%= form_with url: gateway_path, local: true, data: { turbo: false } do |f| %>
  ...
<% end %>

And keep my controller like it was.

render(html: @gateway_response.message.html_safe)

Happy upgrade anyone

Solution 2:[2]

Setting data: {turbo: false} will cause the page to reload entirely. This takes away the entire point of turbo which is to reduce page reloads.

The reason the error occurs is because Turbo expects a 303 redirect response. The solution is to have the server respond with 422 or 500 status code when you are not redirecting.

if save
redirect_to root_path
else
render :new, status: 422

You can read about this here: https://turbo.hotwired.dev/handbook/drive#redirecting-after-a-form-submission

Of course, if you want the page to reload, you can use data-turbo: false

Solution 3:[3]

Thanks! I'm also developing on Rails 7 and data: { turbo: false } fixed my issue.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 user15829831
Solution 2 def avi
Solution 3 cesar.g