Skip to content

Commit 6aa26ed

Browse files
authored
Merge pull request #115 from nduitz/fix-nested-embeds-errors
Fix nested embeds errors
2 parents 2c7b9d4 + 16c5b55 commit 6aa26ed

5 files changed

Lines changed: 73 additions & 6 deletions

File tree

lib/polymorphic_embed/html/helpers.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
108108
index: if(array?, do: i),
109109
errors: errors,
110110
data: data,
111+
action: parent_action,
111112
params: params,
112113
hidden: [{type_field_name, to_string(type)}],
113114
options: options

test/polymorphic_embed_test.exs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2532,6 +2532,43 @@ defmodule PolymorphicEmbedTest do
25322532
end
25332533

25342534
describe "polymorphic_embed_inputs_for/1" do
2535+
test "errors in form for polymorphic embed and nested embed" do
2536+
reminder_module = get_module(Reminder, :polymorphic)
2537+
2538+
sms_reminder_attrs = %{
2539+
text: "This is an SMS reminder",
2540+
contexts: [
2541+
%{
2542+
__type__: "device",
2543+
extra: %{}
2544+
}
2545+
]
2546+
}
2547+
2548+
changeset =
2549+
reminder_module
2550+
|> struct()
2551+
|> reminder_module.changeset(sms_reminder_attrs)
2552+
2553+
changeset = %{changeset | action: :insert}
2554+
2555+
html_string =
2556+
render_component(
2557+
&liveview_form_with_inputs_for/1,
2558+
%{changeset: changeset, field: :contexts}
2559+
)
2560+
2561+
assert String.contains?(
2562+
html_string,
2563+
"[type: {"can't be blank", [validation: :required]}]"
2564+
)
2565+
2566+
assert String.contains?(
2567+
html_string,
2568+
"[imei: {"can't be blank", [validation: :required]}]"
2569+
)
2570+
end
2571+
25352572
test "generates forms that can be rendered (custom type field/identify_by_fields)" do
25362573
reminder_module = get_module(Reminder, :polymorphic)
25372574

@@ -3549,6 +3586,24 @@ defmodule PolymorphicEmbedTest do
35493586
"""
35503587
end
35513588

3589+
defp liveview_form_with_inputs_for(assigns) do
3590+
~H"""
3591+
<.form
3592+
:let={f}
3593+
for={@changeset}
3594+
>
3595+
<.polymorphic_embed_inputs_for field={f[@field]} :let={sms_form}>
3596+
<%= text_input sms_form, :number %>
3597+
<%= sms_form.errors |> inspect() %>
3598+
<.inputs_for field={sms_form[:extra]} :let={channel_form}>
3599+
<%= text_input channel_form, :imei %>
3600+
<%= channel_form.errors |> inspect() %>
3601+
</.inputs_for>
3602+
</.polymorphic_embed_inputs_for>
3603+
</.form>
3604+
"""
3605+
end
3606+
35523607
defp polymorphic?(:polymorphic), do: true
35533608
defp polymorphic?(:not_polymorphic), do: false
35543609
end

test/support/models/polymorphic/reminder/context/device.ex

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@ defmodule PolymorphicEmbed.Reminder.Context.Device do
66
field :ref, :string
77
field :type, :string
88

9-
embeds_one :extra, Extra do
10-
field :imei, :string
11-
end
9+
embeds_one :extra, PolymorphicEmbed.Reminder.Context.Extra
1210
end
1311

1412
def changeset(struct, params) do
1513
struct
1614
|> cast(params, ~w(ref type)a)
1715
|> validate_required(~w(type)a)
16+
|> cast_embed(:extra)
1817
end
1918
end

test/support/models/polymorphic/reminder/context/device_no_id.ex

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ defmodule PolymorphicEmbed.Reminder.Context.DeviceNoId do
88
field :ref, :string
99
field :type, :string
1010

11-
embeds_one :extra, Extra do
12-
field :imei, :string
13-
end
11+
embeds_one :extra, PolymorphicEmbed.Reminder.Context
1412
end
1513

1614
def changeset(struct, params) do
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
defmodule PolymorphicEmbed.Reminder.Context.Extra do
2+
use Ecto.Schema
3+
import Ecto.Changeset
4+
5+
embedded_schema do
6+
field :imei, :string
7+
end
8+
9+
def changeset(extra, attrs) do
10+
extra
11+
|> cast(attrs, [:imei])
12+
|> validate_required([:imei])
13+
end
14+
end

0 commit comments

Comments
 (0)