首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数exto.ChangeSet.cast_assoc/3未定义(模块Ecto.ChangeSet不可用)

函数exto.ChangeSet.cast_assoc/3未定义(模块Ecto.ChangeSet不可用)
EN

Stack Overflow用户
提问于 2021-01-02 13:15:50
回答 1查看 379关注 0票数 1

我是新来的灵丹妙药,凤凰和经济,所以我跟随一个视频教程。本教程通过模式为用户设置凭据,每个用户都有一个唯一的凭据。所以我有一个用户:

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

和一张证书:

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

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

创建凭据代码是

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

一次广泛的搜索发现了一些接近我问题的文章,但是没有任何帮助。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-04 14:30:31

正如前面的评论所指出的,模块的正确名称是Ecto.Changeset --大写问题!虽然已编译了Elixir,但它仍然具有一定的运行时灵活性,可以使用动态模块名称:在其他语言中,拼写错误的模块名将是编译时错误,但在Elixir中,这些是运行时错误(!)。(这是设计出来的:它是使Erlang/Elixir热交换和能够更新正在运行的系统的部分原因)。

这里的提取是非常警惕您的模块和函数名的大写化。每当您收到“未定义”错误时,请三次检查是否拼写正确的模块名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65539481

复制
相关文章

相似问题

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