【问题标题】:no function clause matching in Ecto.Changeset.cast/4 in an update function更新函数中的 Ecto.Changeset.cast/4 中没有函数子句匹配
【发布时间】:2022-11-05 12:13:18
【问题描述】:

我正在尝试更新 select2 多个但遇到挑战

这是我的架构

defmodule Recon.Accounts.OriginatorMapping do
  use Ecto.Schema
  use Endon
  import Ecto.Changeset

  @timestamps_opts [autogenerate: {Recon.Reconmaster.Master.Localtime, :autogenerate, []}]
  schema "tbl_originator_mapping" do
    # field :org_id, :id
    # field :participants_id, :id

    field :status, :string, default: "D"

    belongs_to :originator, Recon.Accounts.OriginatorIds, foreign_key: :org_id, type: :id
    belongs_to :participant, Recon.Accounts.Participant, foreign_key: :participants_id, type: :id
    belongs_to :maker, Recon.Accounts.OriginatorIds, foreign_key: :maker_id, type: :id
    belongs_to :checker, Recon.Accounts.Participant, foreign_key: :checker_id, type: :id

    timestamps()
  end

  @doc false
  def changeset(originator_mapping, attrs) do
    originator_mapping
    |> cast(attrs, [:org_id, :participants_id, :maker_id, :checker_id, :status])
    |> validate_required([])
  end
end

这是我在控制器中的创建功能:

def update_originator_mapping(conn, params) do
    activity = "Modified Originator Mapping for "
    user = conn.assigns.user

    params["participants_id"]
    |> Enum.with_index()
    |> Enum.reduce(Ecto.Multi.new(), fn {_col, index}, multi ->
      column_params = %{
        maker_id: conn.assigns.user.id,
        checker_id: conn.assigns.user.id,
        participants_id: Enum.at(params["participants_id"], index),
        org_id: params["org_id"]
      }
      participant_id = Enum.at(params["participants_id"], index)
      column =
        if byte_size(participant_id) > 0, do: OriginatorMapping.find_by(org_id: params["org_id"], participants_id: participant_id), else: %OriginatorMapping{}
      changeset = OriginatorMapping.changeset(column, column_params)
      Ecto.Multi.insert_or_update(multi, {:column, index}, changeset)
    end)
    |> Ecto.Multi.insert(:user_log, %UserLog{user_id: user.id, activity: activity})
    |> Repo.transaction()
    |> case do
      {:ok, %{user_log: _user_log}} ->
        json(conn, %{data: "Operation Successfull!"})

      {:error, _failed_operation, failed_value, _changes_so_far} ->
        reason = traverse_errors(failed_value.errors) |> List.first()
        json(conn, %{error: reason})
    end
end

日志中的错误是:

[错误] #PID<0.1831.0> running ReconWeb.Endpoint (connection #PID<0.1671.0>, stream id 37) 终止 服务器:本地主机:4000(http) 请求:POST /update/originator/mapping **(退出)引发异常: ** (FunctionClauseError) Ecto.Changeset.cast/4 中没有函数子句匹配 (ecto 3.8.3) lib/ecto/changeset.ex:480: Ecto.Changeset.cast(nil, %{checker_id: 1, maker_id: 1, org_id: "1",参与者_id: "3"}, [:org_id , :participants_id, :maker_id, :checker_id, :status], []) (侦察 0.1.0) lib/recon/accounts/originator_mapping.ex:24: Recon.Accounts.OriginatorMapping.changeset/2 (侦察 0.1.0)lib/recon_web/controllers/originator_ids_controller.ex:353:ReconWeb.OriginatorIdsController.update_originator_mapping/2 中的匿名 fn/4 (elixir 1.13.3) lib/enum.ex:2396: Enum."-reduce/3-lists^foldl/2-0-"/3 (侦察 0.1.0) lib/recon_web/controllers/originator_ids_controller.ex:340: ReconWeb.OriginatorIdsController.update_originator_mapping/2 (侦察 0.1.0) lib/recon_web/controllers/originator_ids_controller.ex:1: ReconWeb.OriginatorIdsController.action/2 (侦察 0.1.0) lib/recon_web/controllers/originator_ids_controller.ex:1: ReconWeb.OriginatorIdsController.phoenix_controller_pipeline/2 (phoenix 1.5.13) lib/phoenix/router.ex:352: Phoenix.Router。称呼/2 (recon 0.1.0) lib/recon_web/endpoint.ex:1: ReconWeb.Endpoint.plug_builder_call/2 (recon 0.1.0) lib/plug/debugger.ex:136: ReconWeb.Endpoint."call (overridable 3)"/2 (recon 0.1.0) lib/recon_web/endpoint.ex:1: ReconWeb.Endpoint.call/2 (phoenix 1.5.13) lib/phoenix/endpoint/cowboy2_handler.ex:65: Phoenix.Endpoint.Cowboy2Handler.init/4 (cowboy 2.9.0) d:/Work/Recon/recon/deps/cowboy/src/cowboy_handler.erl:37: :cowboy_handler.execute/2 (cowboy 2.9.0) d:/Work/Recon/recon/deps/cowboy/src/cowboy_stream_h.erl:306: :cowboy_stream_h.execute/3 (cowboy 2.9.0) d:/Work/Recon/recon/deps/cowboy/src/cowboy_stream_h.erl:295: :cowboy_stream_h.request_process/3 (stdlib 3.14.1) proc_lib.erl:226: :proc_lib.init_p_do_apply/3

【问题讨论】:

  • 请分享lib/recon/accounts/originator_mapping.ex:24 和周围。
  • 我会根据columnnil 的错误猜测,因为OriginatorMapping.find_by(org_id: params["org_id"], participants_id: participant_id) 返回nil

标签: elixir phoenix-framework ecto


【解决方案1】:

您的问题是 cast/4 不期望 nil 作为第一个参数。就像@sabiwara 所说,您的查询返回零。在调用铸造之前,请务必找到记录或对其进行处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多