casting - 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
日志中的错误是:
- (exit) 引发异常:** (FunctionClauseError) Ecto.Changeset.cast/4 (ecto 3.5.2) lib/ecto/changeset.ex:461 中没有函数子句匹配:Ecto.Changeset.cast(TimeManager.Workingtimes .Workingtime, %{"end" => ~N[2020-10-21 19:45:24.879000], "start" => ~N[2020-10-21 19:45:24.879000], "user_id" => "1"}, [:start, :end, :user_id], []) (time_manager 0.1.0) lib/time_manager/workingtimes/workingtime.ex:16: TimeManager.Workingtimes.Workingtime.changeset/2 (time_manager 0.1. 0) lib/time_manager/workingtimes.ex:63: TimeManager.Workingtimes.create_workingtime/1 (time_manager 0.1.0) lib/time_manager_web/controllers/workingtime_controller.ex:16: TimeManagerWeb.WorkingtimeController.create/2 (time_manager 0.1.0) lib/time_manager_web/controllers/workingtime_controller.ex:1:TimeManagerWeb。WorkingtimeController.action/2 (time_manager 0.1.0) lib/time_manager_web/controllers/workingtime_controller.ex:1: TimeManagerWeb.WorkingtimeController.phoenix_controller_pipeline/2
解决方案
Ecto.Changeset.cast/4将模式结构作为第一个参数,而不是模式模块。在您的create_workingtime/1
函数中,尝试更改为:
%Workingtime{}
|> Workingtime.changeset(attrs)
|> Repo.insert()
推荐阅读
- python - 规范化 Python 字典以适应数据库表结构
- typescript - Typescript 类数组类型,在每个项目的键之间具有相同的泛型类型
- twitter-bootstrap - 针对中国的引导 cdn
- vector - 为什么我在使用置换器箱中的迭代器推入向量时得到“预期的 u32,找到 &{integer}”?
- java - 是否可以收集语句执行期间创建的行?
- java - 如何对角分割JPanel
- angular - 如何在 Angular 8 库中打包量角器页面对象
- sql - SQL SERVER - 复杂的 SQL 查询 2
- json - 将 Excel 工作表(嵌套)转换为 JSON
- python-3.x - PyQt5:切换“保持领先”在 Ubuntu 中不起作用