Elixir (ArgumentError)无法为<;协会>;
在嵌套表单上呈现变更集错误时遇到一些问题 表单呈现:Elixir (ArgumentError)无法为<;协会>;,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,在嵌套表单上呈现变更集错误时遇到一些问题 表单呈现: def new(conn, _) do changeset = Organizations.Organization.create_organization_changeset(%Organization{workspace: %Workspace{}}) render(conn, "new.html", changeset: changeset) end 表单最初呈现为罚款: <%= form_for @changeset,
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 %>
“快乐之路”运作良好。但是,如果工作区
存在变更集错误,例如:
#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
>
工作区架构:
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
错误消息显示:
** (ArgumentError) could not generate inputs for :workspace from Workspaces.Workspace
因此,我假设您传递的是@changeset
中的工作区,而不是组织。然后,inputs\u for
尝试从工作区获取工作区。因此,我会确保@changeset
实际上是一个组织
另外,对于,同时使用多输入和输入有点笨拙<用于
的代码>输入通常与cast\u assoc/cast\u embed
一起使用,它可以在内部为您设置多重输入,因此您无需手动执行。更多信息请点击此处:
或者,您可以删除的输入,并分别处理这两个变更集。谢谢。实际上我在你的博文中尝试过使用
cast\u assoc
之类的,但是Organization
和Workspace
在不同的数据库模式上,所以失败了:你的Ecto版本是什么?如果它是Ecto 3.0并且不起作用,那么我担心它不会起作用,因为它假设所有模式都在同一前缀中。因此,对使用Multi而不是cast\u assoc+inputs\u确实是最好的方法。
schema "organizations" do
...
field :workspace_id, :integer
has_one :workspace, Workspaces.Workspace
end
** (ArgumentError) could not generate inputs for :workspace from Workspaces.Workspace