diff --git a/lib/polymorphic_embed/html/helpers.ex b/lib/polymorphic_embed/html/helpers.ex
index 7822d46..a91c7f4 100644
--- a/lib/polymorphic_embed/html/helpers.ex
+++ b/lib/polymorphic_embed/html/helpers.ex
@@ -107,6 +107,7 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d
index: if(array?, do: i),
errors: errors,
data: data,
+ action: parent_action,
params: params,
hidden: [{type_field_name, to_string(type)}],
options: options
diff --git a/test/polymorphic_embed_test.exs b/test/polymorphic_embed_test.exs
index 7dced00..bf98a63 100644
--- a/test/polymorphic_embed_test.exs
+++ b/test/polymorphic_embed_test.exs
@@ -2503,6 +2503,43 @@ defmodule PolymorphicEmbedTest do
end
describe "polymorphic_embed_inputs_for/1" do
+ test "errors in form for polymorphic embed and nested embed" do
+ reminder_module = get_module(Reminder, :polymorphic)
+
+ sms_reminder_attrs = %{
+ text: "This is an SMS reminder",
+ contexts: [
+ %{
+ __type__: "device",
+ extra: %{}
+ }
+ ]
+ }
+
+ changeset =
+ reminder_module
+ |> struct()
+ |> reminder_module.changeset(sms_reminder_attrs)
+
+ changeset = %{changeset | action: :insert}
+
+ html_string =
+ render_component(
+ &liveview_form_with_inputs_for/1,
+ %{changeset: changeset, field: :contexts}
+ )
+
+ assert String.contains?(
+ html_string,
+ "[type: {"can't be blank", [validation: :required]}]"
+ )
+
+ assert String.contains?(
+ html_string,
+ "[imei: {"can't be blank", [validation: :required]}]"
+ )
+ end
+
test "generates forms that can be rendered (custom type field/identify_by_fields)" do
reminder_module = get_module(Reminder, :polymorphic)
@@ -3520,6 +3557,24 @@ defmodule PolymorphicEmbedTest do
"""
end
+ defp liveview_form_with_inputs_for(assigns) do
+ ~H"""
+ <.form
+ :let={f}
+ for={@changeset}
+ >
+ <.polymorphic_embed_inputs_for field={f[@field]} :let={sms_form}>
+ <%= text_input sms_form, :number %>
+ <%= sms_form.errors |> inspect() %>
+ <.inputs_for field={sms_form[:extra]} :let={channel_form}>
+ <%= text_input channel_form, :imei %>
+ <%= channel_form.errors |> inspect() %>
+
+
+
+ """
+ end
+
defp polymorphic?(:polymorphic), do: true
defp polymorphic?(:not_polymorphic), do: false
end
diff --git a/test/support/models/polymorphic/reminder/context/device.ex b/test/support/models/polymorphic/reminder/context/device.ex
index 31684f8..9ea491d 100644
--- a/test/support/models/polymorphic/reminder/context/device.ex
+++ b/test/support/models/polymorphic/reminder/context/device.ex
@@ -6,14 +6,13 @@ defmodule PolymorphicEmbed.Reminder.Context.Device do
field :ref, :string
field :type, :string
- embeds_one :extra, Extra do
- field :imei, :string
- end
+ embeds_one :extra, PolymorphicEmbed.Reminder.Context.Extra
end
def changeset(struct, params) do
struct
|> cast(params, ~w(ref type)a)
|> validate_required(~w(type)a)
+ |> cast_embed(:extra)
end
end
diff --git a/test/support/models/polymorphic/reminder/context/device_no_id.ex b/test/support/models/polymorphic/reminder/context/device_no_id.ex
index 3f6f9a5..37b8292 100644
--- a/test/support/models/polymorphic/reminder/context/device_no_id.ex
+++ b/test/support/models/polymorphic/reminder/context/device_no_id.ex
@@ -8,9 +8,7 @@ defmodule PolymorphicEmbed.Reminder.Context.DeviceNoId do
field :ref, :string
field :type, :string
- embeds_one :extra, Extra do
- field :imei, :string
- end
+ embeds_one :extra, PolymorphicEmbed.Reminder.Context
end
def changeset(struct, params) do
diff --git a/test/support/models/polymorphic/reminder/context/extra.ex b/test/support/models/polymorphic/reminder/context/extra.ex
new file mode 100644
index 0000000..e054c1d
--- /dev/null
+++ b/test/support/models/polymorphic/reminder/context/extra.ex
@@ -0,0 +1,14 @@
+defmodule PolymorphicEmbed.Reminder.Context.Extra do
+ use Ecto.Schema
+ import Ecto.Changeset
+
+ embedded_schema do
+ field :imei, :string
+ end
+
+ def changeset(extra, attrs) do
+ extra
+ |> cast(attrs, [:imei])
+ |> validate_required([:imei])
+ end
+end