协议 Ecto.Queryable 未实现

Posted

技术标签:

【中文标题】协议 Ecto.Queryable 未实现【英文标题】:protocol Ecto.Queryable not implemented for 【发布时间】:2016-06-16 05:38:44 【问题描述】:

我正在尝试在我的 API 中实现 Guardian 并通过它执行登录以获取 JWT。我正在看的教程是here。问题是使用类似于他们在示例中使用的用户模型来实现登录。模型代码如下所示:

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

use Ecto.Repo
import Ecto.Query
  alias PushflightServer.Repo

  schema "users" do
    field :name, :string
    field :email, :string
    field :encrypted_password, :string
    field :password, :string, virtual: true
    field :verify_token, :string
    field :verify_date, Ecto.DateTime

    timestamps
  end

  def from_email(nil), do:  :error, :not_found 
  def from_email(email) do
    IO.write("Before email")
    IO.inspect(email)
    Repo.one(User, email: email)
  end

如果我从 Phoenix 内部或直接在 iex -S mix 中调用 from_email,我会收到以下错误:

user = PushflightServer.User.from_email("rob@json.com")

** (Protocol.UndefinedError) 协议 Ecto.Queryable 未为用户实现,给定模块不存在 (ecto) lib/ecto/queryable.ex:33: Ecto.Queryable.Atom.to_query/1 (ecto) lib/ecto/repo/queryable.ex:90: Ecto.Repo.Queryable.execute/5 (ecto) lib/ecto/repo/queryable.ex:15: Ecto.Repo.Queryable.all/4 (ecto) lib/ecto/repo/queryable.ex:44: Ecto.Repo.Queryable.one/4

我一定遗漏了一些简单的东西,但我找不到任何关于为什么会发生这种情况的文档。使用 Repo 插入数据工作正常。有什么想法吗?

【问题讨论】:

【参考方案1】:

您需要将User 完全命名为PushflightServer.User,或者您可以使用快捷方式__MODULE__

【讨论】:

【参考方案2】:

您应该使用命名空间引用模块

  def from_email(email) do
    PushflightServer.one(PushflightServer.User, email: email)
  end

【讨论】:

以上是关于协议 Ecto.Queryable 未实现的主要内容,如果未能解决你的问题,请参考以下文章

BitTorrent 协议实现:未收到“Piece”消息

(Protocol.UndefinedError) 协议 Enumerable 未实现 3

Phoenix/Elixir - 协议 Enumerable 未实现

iPhone SDK 警告:MyAppViewController 类未实现“UITabbarDelegate”协议

类未确认协议 CBPeripheralManagerDelegate

无法在 phoenix 中创建自定义链接:协议 Enumerable 未实现