Do you maintain both @data and @form that is based on @data as the "source of truth"?

I do that like below.

@impl true
def handle_event("event", %{"data" => data}, socket) do
  your_params = %{...}

  data_params =
    socket.assigns.form.source.params
    |> Map.merge(your_params)

  form =
    DataParams.changeset(%DataParams{}, data_params)
    |> to_form(as: :data)
    |> Map.put(:action, :validate)

  socket = socket |> assigns(:form, form)

  {:noreply, socket}
end

To make it easily, I made a simple helper library.

3 Likes