(ArgumentError) не удалось сгенерировать входные данные для <association> - PullRequest
0 голосов
/ 28 мая 2019

Возникли некоторые проблемы с отображением ошибок набора изменений во вложенной форме.

Рендеринг формы:

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

1 Ответ

0 голосов
/ 29 мая 2019

Сообщение об ошибке гласит:

** (ArgumentError) could not generate inputs for :workspace from Workspaces.Workspace

Итак, я предполагаю, что вы передаете рабочее пространство в @changeset, а не организацию. Затем inputs_for пытается получить рабочее пространство из рабочего пространства. Поэтому я бы убедился, что @changeset на самом деле организация.

Кроме того, это немного неловко как для multi, так и для inputs_for. inputs_for обычно используется с cast_assoc/cast_embed, который настраивает мульти для вас, так что вам не нужно делать это вручную. Более подробная информация здесь: http://blog.plataformatec.com.br/2015/08/working-with-ecto-associations-and-embeds/

Либо вы отбрасываете inputs_for и работаете с обоими наборами изменений по отдельности.

...