首页 > 解决方案 > Ecto.Changeset.cast/4 中没有函数子句匹配

问题描述

我一直遇到 naivedatetime 的铸造错误。请问有人可以解开我吗?

这是我想要做的 POST 请求: URL: http://localhost:4000/api/workingtimes/1

身体:

{“开始”:“2019-08-21 07:27:00”,“结束”:“2020-09-20 07:27:00”}

这是我的架构:

 defmodule TimeManager.Workingtimes.Workingtime do
  use Ecto.Schema
  import Ecto.Changeset

  schema "workingtimes" do
    field :start, :naive_datetime
    field :end, :naive_datetime
    belongs_to :user, TimeManager.Users.User

    timestamps()
  end

  @doc false
  def changeset(workingtime, attrs) do
    workingtime
    |> cast(attrs, [:start, :end, :user_id])
    |> validate_required([:start, :end, :user_id])
    |> assoc_constraint(:user)
  end
end

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

  def create(conn, workingtime_params) do
    with {:ok, %Workingtime{} = workingtime} <- Workingtimes.create_workingtime(workingtime_params) do
      conn
      |> put_status(:created)
      |> put_resp_header("location", Routes.workingtime_path(conn, :show, workingtime))
      |> render("workingtime.json", workingtime: workingtime)
    end
  end

最后,这是我的 workingtimes.ex 中的 create_workingtime 函数

  def create_workingtime(attrs \\ %{}) do
    %{"start" => starttime, "end" => endtime, "user_id"=>user_id } = attrs
    {:ok, naivestart} = NaiveDateTime.from_iso8601(starttime)
    {:ok, naiveend} = NaiveDateTime.from_iso8601(endtime)
    attrs = %{"start" => naivestart, "end"=>naiveend, "user_id"=>user_id}
  
    Workingtime
    |> Workingtime.changeset(attrs)
    |> Repo.insert()
  end

日志中的错误是:

标签: castingelixirphoenix

解决方案


Ecto.Changeset.cast/4将模式结构作为第一个参数,而不是模式模块。在您的create_workingtime/1函数中,尝试更改为:

%Workingtime{}
|> Workingtime.changeset(attrs)
|> Repo.insert()

推荐阅读