【问题标题】:function Ecto.ChangeSet.cast_assoc/3 is undefined (module Ecto.ChangeSet is not available)函数 Ecto.ChangeSet.cast_assoc/3 未定义(模块 Ecto.ChangeSet 不可用)
【发布时间】:2021-03-09 21:29:09
【问题描述】:

我是 Elixir、Phoenix 和 Ecto 的新手,所以我正在关注视频教程。本教程通过模式为用户设置凭据,每个用户都有一个唯一的凭据。所以我有一个用户:

defmodule Foo.Accounts.User do
  use Ecto.Schema
  import Ecto.Changeset

  alias Foo.Accounts.Credential


  schema "users" do
    field :name, :string
    field :username, :string
    has_one :credential, Credential

    timestamps()
  end

  @doc false
  def changeset(user, attrs) do
    user
    |> cast(attrs, [:name, :username])
    |> validate_required([:name, :username])
    |> unique_constraint(:username)
  end
end

和证书:

defmodule Foo.Accounts.Credential do
  use Ecto.Schema
  import Ecto.Changeset

  alias Foo.Accounts.User

  schema "credentials" do
    field :email, :string
    belongs_to :user, User

    timestamps()
  end

  def changeset(credential, attrs) do
    credential
    |> cast(attrs, [:email])
    |> validate_required([:email])
    |> unique_constraint(:email)

  end

end

create_user 代码是:

  def create_user(attrs \\ %{}) do
    %User{}
    |> User.changeset(attrs)
    |> Ecto.ChangeSet.cast_assoc(:credential, with: &Credential.changeset/2)
    |> Repo.insert()
  end

创建凭证代码是

 def create_credential(attrs \\ %{}) do
    %Credential{}
    |> Credential.changeset(attrs)
    |> Repo.insert()
  end

当我尝试插入具有完整有效数据的用户时 - 我收到错误

在 POST /users 时出现 UndefinedFunctionError 函数 Ecto.ChangeSet.cast_assoc/3 未定义(模块 Ecto.ChangeSet 不可用)

我不知道为什么。

错误屏幕显示 Ecto.ChangeSet.cast_assoc/3 用 3 个参数调用 #Ecto.Changeset,有效?:true> :凭据 [与:&Foo.Accounts.Credential.changeset/2]

用户 %{"email" => "jimmyjobber@emailaddress.com", "name" => "jimmyjobber", "username" => "jimmyjobber"}

来自 Ecto 文档 cast_assoc/3 用于处理外部数据。

广泛搜索找到了与我的问题相近的文章,但没有任何帮助。

请告诉我我错过了什么,以便我继续学习本教程。

【问题讨论】:

  • 没有Ecto.ChangeSet这样的模块,名称是Ecto.Changeset,通过查看架构模块中的导入可以注意到。
  • 丹尼尔,谢谢你。在我所有的代码中,大小写敏感度都被遗漏了。

标签: elixir phoenix-framework ecto changeset


【解决方案1】:

正如之前的评论所指出的,模块的正确名称是Ecto.Changeset——大写很重要!尽管 Elixir 已编译,但它仍然具有一些运行时灵活性,允许动态模块名称之类的东西:在其他语言中,拼写错误的模块名称将是 compile-time 错误,但在 Elixir 中,这些是运行时错误 (!)。 (这是设计使然:它是 Erlang/Elixir 可热插拔并能够更新正在运行的系统的一部分)。

这里的要点是非常注意模块和函数名称的大小写。每当您收到“未定义”错误时,请仔细检查您是否正确拼写了模块名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-06
    • 2017-04-14
    • 1970-01-01
    • 2015-02-25
    • 2019-01-12
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多