早上好,
从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;凤凰城世界因此没有商业逻辑,只是现在只需遵循在线教程。
提前致谢,
答案 0 :(得分:1)
Api.User
应该实现Ecto.Queryable
协议,错误消息清楚地说明了这一点。虽然可以手动执行此操作,但常见的方法是使用Ecto
帮助程序来完成此任务。通常,需要以下两个import
和use
来满足所有需求:
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