我正在构建一个嵌套表单(LiveView)并想验证嵌套关联。但是,即使嵌套关联在变更集中返回错误,当在表单中使用变更集时,也不会拾取错误。我附上了下面表格的转储,我不确定如何让错误显示在变更集中。
我有一个表,一个引用自身的交易表(例如,像朋友分摊账单之类的东西)。我能够完成所有正常的快乐路径操作
schema "transactions" do
field :date, :date
field :amount, :float
field :has_splits, :boolean, default: false
field :temp_id, :string, virtual: true
field :delete, :boolean, virtual: true
belongs_to :parent_transaction, Transactions, foreign_key: :parent_transaction_id
has_many :child_transactions, Transactions, foreign_key: :parent_transaction_id
end
当其中一个子项出现错误时,变更集会显示错误(未按预期保存到表中),但表单永远不会发现错误。
我将协会选角如下:
def changeset(transactions, attrs) do
transactions
|> cast(attrs, @params)
|> cast_assoc(:child_transactions)
|> validate_required([:amount, :date])
end
表单片段如下所示:
<.form let={ f } for={ @changeset } phx-change="validate" phx-target={ @myself } phx-submit="save">
<%= inputs_for f, :child_transactions, fn v -> %>
<%= hidden_input v, :parent_transaction_id %>
<%= label v, :amount, class: "label"%>
<div>
<%= text_input v, :amount, class: "input" %>
<%= error_tag v, :amount %>
</div>
....
但是,当我输入错误的金额值时,该错误永远不会反映在用户界面上。因此,当出现错误时,我检查了表单,并看到了以下内容:
%Phoenix.HTML.Form{
action: nil,
data: %App.Transaction.Transactions{
__meta__: #Ecto.Schema.Metadata<:built, "transactions">,
amount: nil,
child_transactions: #Ecto.Association.NotLoaded<association :child_transactions is not loaded>,
date: nil,
delete: nil,
has_splits: false,
id: nil,
inserted_at: nil,
parent_id: nil,
parent_transaction: #Ecto.Association.NotLoaded<association :parent_transaction is not loaded>,
temp_id: "1476de26-544f-4640-8f8e-7e68882a84c1",
updated_at: nil,
},
errors: [],
hidden: [],
id: "transactions_child_transactions_0",
impl: Phoenix.HTML.FormData.Ecto.Changeset,
index: 0,
name: "transactions[child_transactions][0]",
options: [],
params: %{
"amount" => "a",
"date" => ~D[2020-04-13],
"parent_transaction_id" => "05f8d1c9-2ed2-4994-a7fb-56c0d334c250",
"temp_id" => "1476de26-544f-4640-8f8e-7e68882a84c1",
},
source: #Ecto.Changeset<
action: nil,
changes: %{
date: ~D[2020-04-13],
effective_date: ~D[2020-04-13],
},
errors: [amount: {"is invalid", [type: :float, validation: :cast]}],
data: #App.Transaction.Transactions<>,
valid?: false
>
}
source
字段表示变更集无效,但不知何故,errors
字段具有[]
,因此我们无法通过error_tag
显示错误。
我需要在
cast_assoc
中做些什么才能使其冒泡到表格中吗?
谢谢!
以防万一有人因为同样的问题来到这里:
我遇到了同样的情况,并设法在父变更集中设置
:action
来修复它:
changeset =
transactions
|> Transactions.changeset(attrs)
|> Map.put(:action, :validate)
我仍在调查情况以及为什么设置
:action
可以解决它。