以嵌套形式处理验证错误

问题描述 投票:0回答:1

我正在构建一个嵌套表单(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
中做些什么才能使其冒泡到表格中吗?

谢谢!

elixir phoenix-framework ecto
1个回答
0
投票

以防万一有人因为同样的问题来到这里:

我遇到了同样的情况,并设法在父变更集中设置

:action
来修复它:

changeset = 
  transactions
  |> Transactions.changeset(attrs)
  |> Map.put(:action, :validate)

我仍在调查情况以及为什么设置

:action
可以解决它。

© www.soinside.com 2019 - 2024. All rights reserved.