凤凰城模块未实现Ecto Queryable

时间:2018-12-10 23:07:10

标签: elixir phoenix-framework ecto

我正在遵循《编程Phoenix 1.4》教程,却遇到一个问题,我被告知Ecto Queryable没有针对给定的模块实现,但我不知道为什么。在SO上还有另一个与此类似的问题,但是它有一个简单的答案,不适用于我的情况。

我的lib/rumbl/accounts/user.ex文件中包含以下代码:

defmodule Rumbl.Accounts.User do
  use Ecto.Schema
  import Ecto.Changeset

  schema "users" do
    field :name, :string
    field :username, :string

    timestamps()
  end
end

这是我的lib/rumbl/accounts/accounts.ex文件中的代码:

defmodule Rumbl.Accounts do
  @moduledoc """
  The Accounts context.
  """

  alias Rumbl.Accounts.User
  alias Rumbl.Repo

  def get_user(id) do
    Repo.get(User, id)
  end

  def get_user!(id) do
    Repo.get!(User, id)
  end

  def get_user_by(params) do
    Repo.get_by(User, params)
  end

  def list_users do
    Repo.all(User)
  end
end

但是,当我从Rumbl.Accounts.list_users呼叫UserController时,出现以下错误:

** (Protocol.UndefinedError) protocol Ecto.Queryable not implemented for Rumbl.Accounts.User, the given module does not provide a schema. This protocol is implemented for: Atom, BitString, Ecto.Query, Ecto.SubQuery, Tuple

mix -S iex中运行相同的查询时,不会出现相同的错误。

这可能是本书建议的代码中的错误,因为它处于beta状态,但我无法终生发现错误所在。在另一篇SO帖子中,用户忘记了别名Rumbl.Accounts.User,但对我而言显然不是这种情况。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您的代码是正确的,应该可以正常工作。可以通过清理构建文件并重新编译代码来解决该问题:

$ mix clean
$ mix compile