我是新来的灵丹妙药,凤凰和经济,所以我跟随一个视频教程。本教程通过模式为用户设置凭据,每个用户都有一个唯一的凭据。所以我有一个用户:
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
endcreate_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当我尝试插入一个具有完全有效数据的用户时,我会得到错误信息。
UndefinedFunctionError at /users函数exto.ChangeSet.cast_assoc/3未定义(模块Ecto.ChangeSet不可用)
我也不知道为什么。
错误屏幕显示了用3个参数调用的exto.ChangeSet.cast_assoc/3-- #Ecto.Changeset,有效?:true>:Credo.Accounts.Credential.Changeset/2
和
用户%{“电子邮件”=> "jimmyjobber@emailaddress.com“、”名称“”=>“jimmyjobber、”用户名“”=>“
在使用外部数据时,使用cast_assoc/3。
一次广泛的搜索发现了一些接近我问题的文章,但是没有任何帮助。
请告诉我,我错过了什么,以便我可以继续本教程。
发布于 2021-01-04 14:30:31
正如前面的评论所指出的,模块的正确名称是Ecto.Changeset --大写问题!虽然已编译了Elixir,但它仍然具有一定的运行时灵活性,可以使用动态模块名称:在其他语言中,拼写错误的模块名将是编译时错误,但在Elixir中,这些是运行时错误(!)。(这是设计出来的:它是使Erlang/Elixir热交换和能够更新正在运行的系统的部分原因)。
这里的提取是非常警惕您的模块和函数名的大写化。每当您收到“未定义”错误时,请三次检查是否拼写正确的模块名。
https://stackoverflow.com/questions/65539481
复制相似问题