@@ -57,53 +57,9 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
5757
5858 struct = Ecto.Changeset . apply_changes ( source_changeset )
5959
60- Map . get ( source_changeset . changes , field )
61- |> case do
62- nil ->
63- case Map . get ( struct , field ) do
64- nil ->
65- type = Keyword . get ( options , :polymorphic_type , get_polymorphic_type ( form , field ) )
66- module = PolymorphicEmbed . get_polymorphic_module ( struct . __struct__ , field , type )
67- if module , do: [ struct ( module ) ] , else: [ ]
68-
69- data ->
70- List . wrap ( data )
71- end
72-
73- data when is_list ( data ) ->
74- data
75-
76- data ->
77- List . wrap ( data )
78- end
60+ resolve_field_data ( source_changeset , struct , form , field , options )
7961 |> Enum . with_index ( )
80- |> Enum . map ( fn
81- { % Ecto.Changeset { } = changeset , i } ->
82- params = changeset . params || % { }
83- errors = get_errors ( changeset )
84-
85- % { changeset: changeset , params: params , errors: errors , index: i }
86-
87- { data , i } ->
88- params = Enum . at ( params , i ) || % { }
89-
90- changeset =
91- data
92- |> Ecto.Changeset . change ( )
93- |> apply_action ( parent_action )
94-
95- errors = get_errors ( changeset )
96-
97- changeset = % {
98- changeset
99- | action: parent_action ,
100- params: params ,
101- errors: errors ,
102- valid?: errors == [ ]
103- }
104-
105- % { changeset: changeset , params: params , errors: errors , index: i }
106- end )
62+ |> Enum . map ( & prepare_changeset ( & 1 , params , parent_action ) )
10763 |> Enum . map ( fn prepared_data ->
10864 % {
10965 changeset: changeset ,
@@ -139,6 +95,52 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
13995 end )
14096 end
14197
98+ defp resolve_field_data ( source_changeset , struct , form , field , options ) do
99+ case Map . get ( source_changeset . changes , field ) do
100+ nil ->
101+ case Map . get ( struct , field ) do
102+ nil ->
103+ type = Keyword . get ( options , :polymorphic_type , get_polymorphic_type ( form , field ) )
104+ module = PolymorphicEmbed . get_polymorphic_module ( struct . __struct__ , field , type )
105+ if module , do: [ struct ( module ) ] , else: [ ]
106+
107+ data ->
108+ List . wrap ( data )
109+ end
110+
111+ data ->
112+ List . wrap ( data )
113+ end
114+ end
115+
116+ defp prepare_changeset ( { % Ecto.Changeset { } = changeset , i } , _params , _parent_action ) do
117+ params = changeset . params || % { }
118+ errors = get_errors ( changeset )
119+
120+ % { changeset: changeset , params: params , errors: errors , index: i }
121+ end
122+
123+ defp prepare_changeset ( { data , i } , params , parent_action ) do
124+ params = Enum . at ( params , i ) || % { }
125+
126+ changeset =
127+ data
128+ |> Ecto.Changeset . change ( )
129+ |> apply_action ( parent_action )
130+
131+ errors = get_errors ( changeset )
132+
133+ changeset = % Ecto.Changeset {
134+ changeset
135+ | action: parent_action ,
136+ params: params ,
137+ errors: errors ,
138+ valid?: errors == [ ]
139+ }
140+
141+ % { changeset: changeset , params: params , errors: errors , index: i }
142+ end
143+
142144 # If the parent changeset had no action, we need to remove the action
143145 # from children changeset so we ignore all errors accordingly.
144146 defp apply_action ( changeset , nil ) , do: % { changeset | action: nil }
0 commit comments