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,谢谢您。我所有的代码检查都忽略了区分大小写。