首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有匹配Eto.Changeset.cast/4中的函数子句

没有匹配Eto.Changeset.cast/4中的函数子句
EN

Stack Overflow用户
提问于 2020-10-21 21:56:06
回答 2查看 976关注 0票数 0

我被“天真时间”的选角错误困住了。有人能帮我解锁吗?

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

正文:

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

下面是我的模式:

代码语言:javascript
复制
 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

下面是我在控制器中的创建函数:

代码语言:javascript
复制
  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

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

代码语言:javascript
复制
  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

日志中的错误是:

  • (退出)引发了一个例外情况:** (FunctionClauseError)没有匹配Exto.Changeset.cast/4(ecto3.5.2) lib/ecto/changeset.ex:461:=> %{"end“=> ~N 2020-10-21 19:45:24.879000,"start”=> ~N 2020-10-21 19:45:24.879000,"user_id“=>1},”开始“,”结束“,:user_id,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_time_manager_time_manager_web:1: TimeManagerWeb.WorkingtimeController.action/2 ( lib/time_manager_web/controllers/workingtime_controller.ex:1: TimeManagerWeb.WorkingtimeController.phoenix_controller_pipeline/2 0.1.0)
EN

回答 2

Stack Overflow用户

发布于 2020-10-21 22:11:48

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

代码语言:javascript
复制
%Workingtime{}
|> Workingtime.changeset(attrs)
|> Repo.insert()
票数 2
EN

Stack Overflow用户

发布于 2020-10-21 22:11:36

发现了这个问题,在create_workingtime函数中,它是:% Workingtime {}

代码语言:javascript
复制
  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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64472282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档