form #=> %Phoenix.HTML.Form{
source: #AshPhoenix.Form<
resource: Marge.AshDomains.Members.MembershipPurchase,
action: :create,
type: :create,
params: %{
"member_purchase_infos" => %{
"0" => %{
"_form_type" => "create",
"_persistent_id" => "0",
"_touched" => "_form_type,_touched,can_email,membership_type,start_date",
"_unused_can_email" => "",
"_unused_can_volunteer" => "",
"_unused_email" => "",
"_unused_first_name" => "",
"_unused_last_name" => "",
"can_email" => "true",
"can_volunteer" => "false",
"date_of_birth" => "2025-11-05",
"email" => "",
"first_name" => "",
"last_name" => "",
"membership_type" => "adult",
"start_date" => "2025-11-17"
}
}
},
source: #Ash.Changeset<
domain: Ash.EmbeddableType.ShadowDomain,
action_type: :create,
action: :create,
attributes: %{},
relationships: %{},
errors: [
%Ash.Error.Changes.Required{
field: :waiver_signature,
type: :attribute,
resource: Marge.AshDomains.Members.MembershipPurchase,
splode: nil,
bread_crumbs: [],
vars: [],
path: [],
stacktrace: #Splode.Stacktrace<>,
class: :invalid
},
%Ash.Error.Changes.Required{
field: :primary_member_email,
type: :attribute,
resource: Marge.AshDomains.Members.MembershipPurchase,
splode: nil,
bread_crumbs: [],
vars: [],
path: [],
stacktrace: #Splode.Stacktrace<>,
class: :invalid
},
%Ash.Error.Changes.InvalidAttribute{
field: :first_name,
message: "must be present",
private_vars: nil,
value: nil,
splode: Ash.Error,
bread_crumbs: ["Exception raised in bulk create: Marge.AshDomains.Members.MemberPurchaseInfo.create"],
vars: [
fields: [:first_name],
keys: "first_name",
attributes: [:first_name],
exactly: 1
],
path: [:member_purchase_infos],
stacktrace: #Splode.Stacktrace<>,
class: :invalid
},
%Ash.Error.Changes.InvalidAttribute{
field: :last_name,
message: "must be present",
private_vars: nil,
value: nil,
splode: Ash.Error,
bread_crumbs: ["Exception raised in bulk create: Marge.AshDomains.Members.MemberPurchaseInfo.create"],
vars: [
fields: [:last_name],
keys: "last_name",
attributes: [:last_name],
exactly: 1
],
path: [:member_purchase_infos],
stacktrace: #Splode.Stacktrace<>,
class: :invalid
},
%Ash.Error.Unknown.UnknownError{
error: "Age cannot be less than 18",
field: nil,
value: [field: :date_of_birth, message: "Age cannot be less than 18"],
splode: Ash.Error,
bread_crumbs: ["Exception raised in bulk create: Marge.AshDomains.Members.MemberPurchaseInfo.create"],
vars: [],
path: [:member_purchase_infos],
stacktrace: #Splode.Stacktrace<>,
class: :unknown
}
],
data: %Marge.AshDomains.Members.MembershipPurchase{
__meta__: #Ecto.Schema.Metadata<:built, "">,
primary_member_email: nil,
waiver_signature: nil,
member_purchase_infos: nil
},
valid?: false
>,
name: "membership_purchase",
data: nil,
form_keys: [
member_purchase_infos: [
type: :list,
resource: Marge.AshDomains.Members.MemberPurchaseInfo,
create_action: :create,
update_action: :update,
embed?: true,
data: #Function<40.101098749/1 in AshPhoenix.Form.Auto.embedded/3>,
forms: []
]
],
forms: %{
member_purchase_infos: [
#AshPhoenix.Form<
resource: Marge.AshDomains.Members.MemberPurchaseInfo,
action: :create,
type: :create,
params: %{
"_form_type" => "create",
"_persistent_id" => "0",
"_touched" => "_form_type,_touched,can_email,membership_type,start_date",
"_unused_can_email" => "",
"_unused_can_volunteer" => "",
"_unused_email" => "",
"_unused_first_name" => "",
"_unused_last_name" => "",
"can_email" => "true",
"can_volunteer" => "false",
"date_of_birth" => "2025-11-05",
"email" => "",
"first_name" => "",
"last_name" => "",
"membership_type" => "adult",
"start_date" => "2025-11-17"
},
source: #Ash.Changeset<
domain: Ash.EmbeddableType.ShadowDomain,
action_type: :create,
action: :create,
attributes: %{
first_name: nil,
last_name: nil,
email: nil,
start_date: ~D[2025-11-17],
date_of_birth: ~D[2025-11-05],
membership_type: :adult,
can_email: true,
can_volunteer: false
},
relationships: %{},
errors: [
%Ash.Error.Changes.InvalidAttribute{
field: :date_of_birth,
message: "Age cannot be less than 18",
private_vars: nil,
value: nil,
splode: Ash.Error,
bread_crumbs: [],
vars: [],
path: [],
stacktrace: #Splode.Stacktrace<>,
class: :invalid
},
%Ash.Error.Changes.InvalidAttribute{
field: :last_name,
message: "must be present",
private_vars: nil,
value: nil,
splode: Ash.Error,
bread_crumbs: [],
vars: [
fields: [:last_name],
keys: "last_name",
attributes: [:last_name],
exactly: 1
],
path: [],
stacktrace: #Splode.Stacktrace<>,
class: :invalid
},
%Ash.Error.Changes.InvalidAttribute{
field: :first_name,
message: "must be present",
private_vars: nil,
value: nil,
splode: Ash.Error,
bread_crumbs: [],
vars: [
fields: [:first_name],
keys: "first_name",
attributes: [:first_name],
exactly: 1
],
path: [],
stacktrace: #Splode.Stacktrace<>,
class: :invalid
}
],
data: %Marge.AshDomains.Members.MemberPurchaseInfo{
__meta__: #Ecto.Schema.Metadata<:built, "">,
membership_type: nil,
start_date: nil,
first_name: nil,
last_name: nil,
date_of_birth: nil,
email: nil,
can_email: false,
can_volunteer: false
},
valid?: false
>,
name: "membership_purchase[member_purchase_infos][0]",
data: nil,
form_keys: [],
forms: %{},
domain: Ash.EmbeddableType.ShadowDomain,
method: "post",
submit_errors: nil,
id: "membership_purchase_member_purchase_infos_0",
transform_errors: nil,
original_data: nil,
transform_params: nil,
prepare_params: nil,
prepare_source: nil,
raw_params: %{
"_form_type" => "create",
"_persistent_id" => "0",
"_touched" => "_form_type,_touched,can_email,membership_type,start_date",
"_unused_can_email" => "",
"_unused_can_volunteer" => "",
"_unused_email" => "",
"_unused_first_name" => "",
"_unused_last_name" => "",
"can_email" => "true",
"can_volunteer" => "false",
"date_of_birth" => "2025-11-05",
"email" => "",
"first_name" => "",
"last_name" => "",
"membership_type" => "adult",
"start_date" => "2025-11-17"
},
warn_on_unhandled_errors?: true,
any_removed?: false,
added?: true,
changed?: true,
touched_forms: MapSet.new(["_form_type", "_persistent_id", "_touched",
"_unused_can_email", "_unused_can_volunteer", "_unused_email",
"_unused_first_name", "_unused_last_name", "can_email",
"can_volunteer", "date_of_birth", "email", "first_name", "last_name",
...]),
valid?: false,
errors: true,
submitted_once?: false,
just_submitted?: false,
...
>
]
},
domain: Ash.EmbeddableType.ShadowDomain,
method: "post",
submit_errors: nil,
id: "membership_purchase",
transform_errors: nil,
original_data: nil,
transform_params: nil,
prepare_params: nil,
prepare_source: nil,
raw_params: %{
"member_purchase_infos" => %{
"0" => %{
"_form_type" => "create",
"_persistent_id" => "0",
"_touched" => "_form_type,_touched,can_email,membership_type,start_date",
"_unused_can_email" => "",
"_unused_can_volunteer" => "",
"_unused_email" => "",
"_unused_first_name" => "",
"_unused_last_name" => "",
"can_email" => "true",
"can_volunteer" => "false",
"date_of_birth" => "2025-11-05",
"email" => "",
"first_name" => "",
"last_name" => "",
"membership_type" => "adult",
"start_date" => "2025-11-17"
}
}
},
warn_on_unhandled_errors?: true,
any_removed?: false,
added?: false,
changed?: true,
touched_forms: MapSet.new(["_form_type", "_touched",
"member_purchase_infos"]),
valid?: false,
errors: true,
submitted_once?: false,
just_submitted?: false,
...
>,
impl: Phoenix.HTML.FormData.AshPhoenix.Form,
id: "membership_purchase",
name: "membership_purchase",
data: nil,
action: nil,
hidden: [
_touched: "_form_type,_touched,member_purchase_infos",
_form_type: "create"
],
params: %{
"member_purchase_infos" => %{
"0" => %{
"_form_type" => "create",
"_persistent_id" => "0",
"_touched" => "_form_type,_touched,can_email,membership_type,start_date",
"_unused_can_email" => "",
"_unused_can_volunteer" => "",
"_unused_email" => "",
"_unused_first_name" => "",
"_unused_last_name" => "",
"can_email" => "true",
"can_volunteer" => "false",
"date_of_birth" => "2025-11-05",
"email" => "",
"first_name" => "",
"last_name" => "",
"membership_type" => "adult",
"start_date" => "2025-11-17"
}
}
},
errors: [
waiver_signature: {"is required", []},
primary_member_email: {"is required", []},
member_purchase_infos: {"must be present", [keys: "first_name", exactly: 1]},
member_purchase_infos: {"must be present", [keys: "last_name", exactly: 1]}
],
options: [method: "post"],
index: nil
}