(UndefinedFunctionError) 模型中未定义的函数更改/2

lfx*_*ool 2 elixir ecto phoenix-framework

我运行一些代码iex -S mix

还行吧:

user = Repo.get User, 1

Ecto.Changeset.change user, %{name: "xxxx"}
Run Code Online (Sandbox Code Playgroud)

但这是错误的:

User.change user, %{name: "xxxx"}
Run Code Online (Sandbox Code Playgroud)

增加(UndefinedFunctionError) undefined function Rumbl.User.change/2

我注意到import Ecto.Changeset文件 web.ex 中有函数模型

def model do
  quote do
    use Ecto.Schema

    import Ecto
    import Ecto.Changeset
    import Ecto.Query, only: [from: 1, from: 2]
  end
end
Run Code Online (Sandbox Code Playgroud)

所以我认为 User.change/2 应该与 Ecto.Changeset.change/2 一样工作,对吗?

Gaz*_*ler 5

我认为您可能误解了它的import工作原理。

来自文档

从其他模块导入函数和宏。

import 允许人们轻松地访问其他模块中的函数或宏,而无需使用限定名称。

这意味着您不必Ecto.Changeset.change(user, %{}在模块内部使用,而是可以使用change(user, %{}).

此更改仅将函数导入到正在使用的模块中。它不会将它们定义为导入模型上的函数。

如果您在 iex 中并且不想键入完全限定的函数名称,您可以执行以下操作:

alias Ecto.Changeset
Changeset.change(user, %{})
Run Code Online (Sandbox Code Playgroud)

或者:

import Ecto.Changeset
change(user, %{})
Run Code Online (Sandbox Code Playgroud)