@@ -44,7 +44,6 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
4444 errors: errors ,
4545 valid?: errors == [ ]
4646 }
47- |> add_changes_for_nested_embeds ( params , errors )
4847
4948 % Phoenix.HTML.Form {
5049 source: changeset ,
@@ -81,66 +80,5 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
8180 defp get_errors ( % { action: nil } ) , do: [ ]
8281 defp get_errors ( % { action: :ignore } ) , do: [ ]
8382 defp get_errors ( % { errors: errors } ) , do: errors
84-
85- defp add_changes_for_nested_embeds ( changeset , params , _errors ) when params == % { } ,
86- do: changeset
87-
88- defp add_changes_for_nested_embeds ( changeset , % { } = params , errors ) do
89- embeds_fields_as_string =
90- changeset . data . __struct__ . __schema__ ( :embeds )
91- |> Enum . map ( & Atom . to_string ( & 1 ) )
92-
93- embeds_params =
94- Enum . filter ( params , fn { key , _ } -> Enum . member? ( embeds_fields_as_string , key ) end )
95- |> Enum . map ( fn { key , value } -> { String . to_existing_atom ( key ) , value } end )
96-
97- do_add_changes_for_nested_embeds ( changeset , embeds_params , errors )
98- end
99-
100- defp do_add_changes_for_nested_embeds ( changeset , [ ] , _errors ) , do: changeset
101-
102- defp do_add_changes_for_nested_embeds (
103- changeset ,
104- [ { embed_field , % { } = embed_params } | tail_params ] ,
105- errors
106- ) do
107- embed_errors =
108- Enum . find ( errors , fn { error_key , _ } -> error_key == embed_field end )
109- |> case do
110- { _ , { _ , errors } } -> errors
111- _ -> [ ]
112- end
113-
114- embed_data =
115- Map . get ( changeset . data , embed_field ) ||
116- get_embed_struct ( changeset , embed_field , embed_params )
117-
118- embed_changeset =
119- % Ecto.Changeset {
120- data: embed_data ,
121- action: changeset . action ,
122- params: embed_params ,
123- errors: embed_errors ,
124- valid?: embed_errors == [ ] ,
125- changes: % { }
126- }
127- |> add_changes_for_nested_embeds ( embed_params , embed_errors )
128-
129- changeset = % { changeset | changes: Map . put ( changeset . changes , embed_field , embed_changeset ) }
130-
131- do_add_changes_for_nested_embeds ( changeset , tail_params , embed_errors )
132- end
133-
134- defp do_add_changes_for_nested_embeds ( changeset , [ _ | tail_params ] , errors ) do
135- do_add_changes_for_nested_embeds ( changeset , tail_params , errors )
136- end
137-
138- defp get_embed_struct ( changeset , field , params ) do
139- changeset
140- |> Ecto.Changeset . cast ( % { field => params } , [ ] )
141- |> Ecto.Changeset . cast_embed ( field )
142- |> Ecto.Changeset . apply_changes ( )
143- |> Map . fetch! ( field )
144- end
14583 end
14684end
0 commit comments