Elixir 未定义函数EXTO.ChangeSet.cast_assoc/3(模块EXTO.ChangeSet不可用)

Elixir 未定义函数EXTO.ChangeSet.cast_assoc/3(模块EXTO.ChangeSet不可用),elixir,phoenix-framework,ecto,changeset,Elixir,Phoenix Framework,Ecto,Changeset,我对长生不老药、凤凰和埃克托还不熟悉,所以我正在学习一个视频教程。本教程通过模式为用户设置凭据,每个用户都有一个唯一的凭据。所以我有一个用户: defmodule Foo.Accounts.User do use Ecto.Schema import Ecto.Changeset alias Foo.Accounts.Credential schema "users" do field :name, :string field :user

我对长生不老药、凤凰和埃克托还不熟悉,所以我正在学习一个视频教程。本教程通过模式为用户设置凭据,每个用户都有一个唯一的凭据。所以我有一个用户:

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
创建用户代码为:

  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/用户处未定义的功能错误 未定义函数EXTO.ChangeSet.cast_assoc/3(模块EXTO.ChangeSet不可用)

我不知道为什么

错误屏幕显示 外部变更集铸造协会/3 用3个参数调用 #外部变更集 :凭证 [使用:&Foo.Accounts.Credential.changeset/2]

使用者 %{“电子邮件”=>“jimmyjobber@emailaddress.com“,“name”=>“jimmyjobber”,“username”=>“jimmyjobber”}

在处理外部数据时,使用EXTO docs cast_assoc/3

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


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

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


这里的要点是要非常注意模块和函数名的大写。每当出现“undefined”错误时,请三次检查模块名称拼写是否正确。

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


这里的要点是要非常注意模块和函数名的大写。每当出现“undefined”错误时,请三次检查模块名称拼写是否正确。

没有像
exto.ChangeSet
这样的模块,名称是
exto.ChangeSet
,您可以通过查看模式模块中的导入来注意到这一点。Daniel,谢谢您。在我所有的代码检查中,都忽略了区分大小写。没有像
exto.ChangeSet
这样的模块,名称是
exto.ChangeSet
,您可以通过查看模式模块中的导入来注意到这一点。Daniel,谢谢您。我所有的代码检查都忽略了区分大小写。