Using the core_components
provided with a fresh phoenix app. If you create a form with an inputs_for
, which has contain float fields using ‘number’ inputs
, decimals will be amended to its value when you change the next field. It doesn’t do this for float inputs not inside the inputs_for
.
For example, my schema looks like this
use Ecto.Schema
import Ecto.Changeset
defmodule InnerPlace do
use Ecto.Schema
import Ecto.Changeset
schema "inner_place" do
field(:float_1, :float)
field(:float_2, :float)
end
def changeset(user, params \\ %{}) do
user
|> cast(params, [:float_1, :float_2])
end
end
schema "place" do
field(:float_1, :float)
field(:float_2, :float)
has_one(:inner_place, InnerPlace, on_replace: :update)
end
def changeset(place, params \\ %{}) do
place
|> cast(params, [:float_1, :float_2])
|> cast_assoc(:inner_place)
end
The form looks like this
<.simple_form for={@form} phx-change="validate" phx-submit="save">
<.input field={@form[:float_1]} label="Float 1" type="number"/>
<.input field={@form[:float_2]} label="Float 2" type="number"/>
<.inputs_for :let={ip} field={@form[:inner_place]}>
<.input field={ip[:float_1]} label="inputs_for Float 1" type="number"/>
<.input field={ip[:float_2]} label="inputs_for Float 2" type="number"/>
</.inputs_for>
</.simple_form>
The validate does nothing special either
def handle_event("validate", %{"place" => params}, socket) do
changeset =
socket.assigns.place
|> Place.changeset(params)
|> Map.put(:action, :validate)
{:noreply, socket |> assign(form: to_form(changeset))}
end
Does anyone know why this might be happening, and how to prevent this?