Возникли некоторые проблемы с отображением ошибок набора изменений во вложенной форме.
Рендеринг формы:
def new(conn, _) do
changeset = Organizations.Organization.create_organization_changeset(%Organization{workspace: %Workspace{}})
render(conn, "new.html", changeset: changeset)
end
Изначально форма прекрасно обрабатывается:
<%= form_for @changeset, signup_path(@conn, :create), fn f -> %>
<%= text_input f, :name, class: "form-control", required: true, autofocus: true %>
<%= label f, :organization_name %>
<%= error_tag f, :name %>
<%= inputs_for f, :workspace, fn w -> %>
<%= text_input w, :subdomain, required: true %>
<%= error_tag w, :subdomain %>
<% end %>
<% end %>
Отправка этоговызовы формы create_organization/1
:
def create_organization(attrs) do
Ecto.Multi.new()
|> Ecto.Multi.run(:organization, fn(_repo, _result) ->
changeset = Organization.create_organization_changeset(%Organization{}, attrs)
tenant = Ecto.Changeset.get_field(changeset, :slug)
Repo.insert(changeset, prefix: TenantActions.build_prefix(tenant))
end)
|> Ecto.Multi.run(:workspace, fn(_repo, %{organization: organization}) ->
attrs = %{subdomain: attrs["workspace"]["subdomain"}, organization_id: organization.id}
%Workspace{}
|> Workspace.changeset(attrs)
|> put_assoc(:organization, organization)
|> Repo.insert()
end)
|> Repo.transaction()
end
«Счастливый путь» работает отлично.Однако, если есть ошибка набора изменений для workspace
, например:
#Ecto.Changeset<
action: :insert,
changes: %{
name: "test",
organization: #Ecto.Changeset<action: :update, changes: %{}, errors: [],
data: #Organizations.Organization<>, valid?: true>,
organization_id: 1,
subdomain: "democompany",
tenant: "test"
},
errors: [
unique_subdomains: {"That workspace URL is not available.",
[constraint: :unique, constraint_name: "unique_subdomains"]}
],
data: #Workspaces.Workspace<>,
valid?: false
>
Это приводит к:
(ArgumentError) could not generate inputs for :workspace from Workspaces.Workspace. Check the field exists and it is one of embeds_one, embeds_many, has_one, has_many, belongs_to or many_to_many
Схема рабочего пространства:
schema "workspaces" do
field :subdomain, :string
belongs_to :organization, Pricetable.Organizations.Organization
timestamps(type: :utc_datetime_usec)
end
Схема организации:
schema "organizations" do
...
field :workspace_id, :integer
has_one :workspace, Workspaces.Workspace
end