I have an schema with embeds_many :features, Feature, on_replace: :delete
. The Feature struct has a number of fields, many of which get validated. One is dims
. But this problem arises for all of them – I can see there are validation errors, but they are nested multiple layers down. And so never show up on the web page form. I don’t understand it…
My form uses:
<.inputs_for :let={f} field={@form[:features]}>
I put a dbg() check directly in the input
core component:
def input(assigns) do
if assigns.id == "request_features_0_dims" do
assigns |> dbg()
end
And this is what I get:
assigns #=> %{
id: "request_features_0_dims",
label: nil,
name: "quote[features][0][dims]",
type: "text",
value: "0.1x",
prompt: nil,
field: nil,
errors: [],
rest: %{},
__changed__: nil,
__given__: %{
id: "request_features_0_dims",
label: nil,
name: "quote[features][0][dims]",
type: "text",
value: "0.1x",
prompt: nil,
field: nil,
errors: [],
rest: %{},
__changed__: nil,
__given__: %{
field: %Phoenix.HTML.FormField{
id: "request_features_0_dims",
name: "quote[features][0][dims]",
errors: [],
field: :dims,
form: %Phoenix.HTML.Form{
source: #Ecto.Changeset<
action: nil,
changes: %{dims: "0.1x"},
errors: [dims: {"is invalid", []}],
data: #NaiPricing.Aperture.Feature<>,
valid?: false,
...
>,
impl: Phoenix.HTML.FormData.Ecto.Changeset,
id: "request_features_0",
name: "quote[features][0]",
data: %NaiPricing.Aperture.Feature{
id: nil,
shape: :round,
count: 1,
dims: "0.1",
tols: "0.005",
edge: 7,
inspect: false,
system_id: 1,
syslock: true,
speed: 1.0,
passes: 10,
slew: 15.0,
type: 1,
distance: 3.14159,
time: 3.14159,
slew_distance: 0.2,
slew_time: 0.01333,
...
},
action: nil,
hidden: [{"_persistent_id", "0"}],
params: %{
"_persistent_id" => "0",
"_unused_count" => "",
"_unused_distance" => "",
"_unused_edge" => "",
"_unused_inspect" => "",
"_unused_passes" => "",
"_unused_shape" => "",
"_unused_slew" => "",
"_unused_slew_distance" => "",
"_unused_slew_time" => "",
"_unused_speed" => "",
"_unused_syslock" => "",
"_unused_time" => "",
"_unused_tols" => "",
...
},
errors: [],
options: [multipart: false],
index: 0
},
value: "0.1x"
},
__changed__: nil
},
multiple: false
},
multiple: false
}
Notice the error in the deep nesting __given__.__given__.field.form.source.errors
. Why is there all this nesting? Why isn’t it just in errors
at the top leve so it will should up on the form?