@zachdaniel, I hope this is a better explanation.
Given a action with an argument this is an embedded resource:
update :add_feature_override do
argument :feature_override, Environments.FeatureOverride, allow_nil?: false
validate {FeatureVariantExists, []}
...
end
And when invalid FeatureVariantExists returns:
{:error,
InvalidArgument.exception(
field: :variant_key, # this is an attribute on the FeatureOverride resource
path: [:feature_override],
message: "variant key not found"
)}
And I have a form like this:
AshPhoenix.Form.for_update(socket.assigns.account, action,
as: "account",
api: Environments,
forms: [auto?: true]
)
|> to_form()
|> AshPhoenix.Form.add_form(:feature_override, params: feature_override_params)
When the form is invalid, the error is as expected in form.source.source.errors[]
but is not in the nested form for feature_override
form.source.source.errors[
%Ash.Error.Changes.InvalidArgument{
field: :variant_key,
message: "variant key not found",
changeset: nil,
query: nil,
error_context: [],
vars: [],
path: [:feature_override],
stacktrace: #Stacktrace<>,
class: :invalid
}
]
form.forms.feature_override.source.errors = [] # I expect my error to be here on the variant_key field with no path
form.forms.feature_override.submit_errors = [] # I expect [variant_key: {"variant key not found", []}]
When getting the error from a graphql mutation (instead of form)
%{"data" => %{"addFeatureOverrideToAccount" => %{"errors" => [%{"code" => "invalid_argument", "fields" => ["variant_key"], "message" => "variant key not found"}], "result" => nil}}}
# I expect fields to ["feature_override", "variant_key"] or even better["input", "featureOverride", "variantKey"]