Phoenix 1.3.2 / Elixir 1.6.5 Ecto.Schema“Protocol Ecto.Queryable not implemented”,“给定的模块不存在”

时间:2018-06-14 07:53:53

标签: elixir phoenix-framework

早上好,

从Phoenix和Elixir开始,我们在使用Ecto和Phoenix V1.3.2时遇到了在线教程的问题。

我们使用以下

设置应用程序
  

混合phx.new api --no-brunch --no-html --database = mysql

在本教程之后我们开始使用Ecto,但我们已经读到有一些重大变化,但无法找出出现以下错误的原因。

  

**(退出)引发了一个异常:       **(Protocol.UndefinedError)协议Ecto.Queryable未针对Api.User实现,给定的模块不存在。这个   协议实现为:Atom,BitString,Ecto.Query,   Ecto.SubQuery,Tuple

以下是我们的一个控制器的示例代码,它被调用得很好(api / lib / api_web / v1 / controllers

defmodule ApiWeb.AuthenticationController do
  use ApiWeb, :controller

  def auth(conn, %{"username" => username, "password" => password}) do
    json conn, Api.Repo.all(Api.User) # ??
  end
end

和我们的Ecto Schema在这里由mix.gen.model(api / web / models)生成

defmodule Api.User do
  use Api.Web, :model

  schema "users" do
    field :username, :string
    field :display_name, :string
    field :password, :binary
    field :api_key, :binary
    field :api_expiry, :naive_datetime
    field :company, :string
    field :email, :string

    timestamps()
  end

  @doc """
  Builds a changeset based on the `struct` and `params`.
  """
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:username, :display_name, :password, :api_key, :api_expiry, :company, :email])
    |> validate_required([:username, :display_name, :password, :api_key, :api_expiry, :company, :email])
  end
end

我们还没有进入Elixir& amp;凤凰城世界因此没有商业逻辑,只是现在只需遵循在线教程。

提前致谢,

1 个答案:

答案 0 :(得分:1)

Api.User应该实现Ecto.Queryable协议,错误消息清楚地说明了这一点。虽然可以手动执行此操作,但常见的方法是使用Ecto帮助程序来完成此任务。通常,需要以下两个importuse来满足所有需求:

use Ecto.Schema
import Ecto.Changeset
import Ecto.Query

也就是说,只需将这三行添加到Api.User模块中:

defmodule Api.User do
  use Ecto.Schema
  import Ecto.Changeset
  import Ecto.Query

  ...
end