Since updates, no route found for POST after Form submitted

Hello everyone,

I tried today to update the mix dependencies of the project, which led to a bug on our forms:

When I click on the confirm button (Surface’s component), the page url updates to add a “#” and the " no route found for POST [current URL path] (MyAppWeb.Router)" error appears. I did not touch the forms, they worked before the update, and here is an example handle_event/3 function linked to one of the forms:

  @impl true
  def handle_event("submit", %{"property" => property_params}, socket) do
    save_property(socket, socket.assigns.action, property_params)
  end

  defp save_property(socket, :edit, property_params) do
    case Properties.update_property(socket.assigns.property, property_params) do
      {:ok, _property} ->
        {:noreply,
         socket
         |> put_flash(:info, "Propriété mise à jour avec succès")
         |> push_redirect(to: socket.assigns.return_to)}

      {:error, %Ecto.Changeset{} = changeset} ->
        {:noreply, assign(socket, :changeset, changeset)}
    end
  end

Here is the list of updated dependencies, my main suspect is surface 0.9.1 => 0.11.0 (minor), but they don’t indicate breaking change on their doc. :

Summary

Upgraded:
appsignal 2.4.3 => 2.7.5
appsignal_phoenix 2.2.1 => 2.3.3
appsignal_plug 2.0.12 => 2.0.14
cachex 3.4.0 => 3.6.0
castore 0.1.20 => 0.1.22
commanded 1.4.1 => 1.4.2
cowboy 2.9.0 => 2.10.0
cowlib 2.11.0 => 2.12.1
credo 1.6.7 => 1.7.0
db_connection 2.4.3 => 2.5.0
decimal 2.0.0 => 2.1.1
earmark 1.4.34 => 1.4.38
earmark_parser 1.4.29 => 1.4.32
ecto 3.9.4 => 3.10.2
ecto_sql 3.9.2 => 3.10.1
esbuild 0.6.0 => 0.7.1 (minor)
eventstore 1.4.1 => 1.4.2
excoveralls 0.15.1 => 0.16.1 (minor)
finch 0.14.0 => 0.16.0 (minor)
floki 0.34.0 => 0.34.3
gen_stage 1.1.2 => 1.2.1
geo 3.4.3 => 3.5.1
geo_postgis 3.4.2 => 3.4.3
gettext 0.20.0 => 0.22.2 (minor)
goth 1.3.1 => 1.4.1
libcluster 3.3.1 => 3.3.3
mint 1.4.2 => 1.5.1
nimble_options 0.5.2 => 1.0.2 (major)
nimble_pool 0.2.6 => 1.0.0 (major)
oban 2.13.6 => 2.15.2
phoenix 1.6.15 => 1.6.16
phoenix_ecto 4.4.0 => 4.4.2
phoenix_html 3.2.0 => 3.3.1
phoenix_live_dashboard 0.7.2 => 0.8.0 (minor)
phoenix_live_view 0.18.3 => 0.19.3 (minor)
phoenix_pubsub 2.1.1 => 2.1.3
phoenix_template 1.0.0 => 1.0.1
plug 1.14.0 => 1.14.2
plug_cowboy 2.6.0 => 2.6.1
plug_crypto 1.2.3 => 1.2.5
postgrex 0.16.5 => 0.17.1 (minor)
pow 1.0.27 => 1.0.31
sourceror 0.11.2 => 0.12.3 (minor)
ssl_verify_fun 1.1.6 => 1.1.7
surface 0.9.1 => 0.11.0 (minor)
tailwind 0.1.9 => 0.1.10
telemetry 1.1.0 => 1.2.1
telemetry_registry 0.3.0 => 0.3.1
tesla 1.5.0 => 1.7.0

Same bug with Elixir 1.14 & 1.15.

Which update do you think could be responsible for the problem? Has anyone encountered the same bug?

Thanks for your time.

It seems to be the Surface update.

After reading the Form API (Surface), I understand that this behaviour (redirection to “#” with the POST method) is the default behaviour and that recent updates have fixed this bug.

Nevertheless, I’m sad that I can’t understand how I should do the old behaviour the “right way”? Don’t redirect after submitting, and let me handle the params myself. The best I get is using the data changeset, but it’s a nested Struct that Cast can’t use (expects a map).

Thanks for your time and help.

I think I had the same problem when updating to live view 0.19
The name of the event in the form changed from phx_submit to phx-submit.
Your form in the template should be something like :
<.form
:let={f}
for={@changeset}
as={:product_model}
phx-change={:validate}
phx-submit={:save}
multipart={true}
%

1 Like

Thanks a lot @ChristopheBelpaire , it was exactly the same problem but with Surface!

The solution :

      <Form
        for={@changeset}
        submit={:submit}
        multipart
        opts={
          "phx-target": @myself,
          class: "grid grid-cols-1 gap-5 sm:grid-cols-6"
        }
      >

I used the “submit” prop (not documented on Surface doc ?) instead of phx_submit, and I changed phx_target for "phx-target". Finally, I added target={@myself} on the Submit button.

Works like a charm!