【问题标题】:(UndefinedFunctionError) undefined function change/2 in Model(UndefinedFunctionError) 模型中未定义的函数更改/2
【发布时间】:2016-04-12 01:03:56
【问题描述】:

我用iex -S mix 运行一些代码

没关系:

user = Repo.get User, 1

Ecto.Changeset.change user, %{name: "xxxx"}

但这是错误的:

User.change user, %{name: "xxxx"}

提高(UndefinedFunctionError) undefined function Rumbl.User.change/2

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

def model do
  quote do
    use Ecto.Schema

    import Ecto
    import Ecto.Changeset
    import Ecto.Query, only: [from: 1, from: 2]
  end
end

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

【问题讨论】:

  • 您的 User 模型是否使用了 AppName.Web, :model?
  • @SashaFonseca 我有,这是《编程凤凰》一书中的 Rumbl
  • 请在此处查看您的答案stackoverflow.com/questions/22587524/…
  • @alecs.popa,我认为这是不同的问题,我误解了import

标签: elixir phoenix-framework ecto


【解决方案1】:

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

来自the docs

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

import 允许人们在不使用限定名称的情况下轻松访问其他模块的函数或宏。

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

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

如果您在 iex 中并且不想输入完全限定的函数名称,您可以这样做:

alias Ecto.Changeset
Changeset.change(user, %{})

或:

import Ecto.Changeset
change(user, %{})

【讨论】:

  • 谢谢,我真的误会import,它与ruby 的包含不同。
猜你喜欢
  • 2016-12-09
  • 2019-04-12
  • 2021-08-28
  • 2016-07-05
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
相关资源
最近更新 更多