【问题标题】:protocol Ecto.Queryable not implemented for协议 Ecto.Queryable 未实现
【发布时间】: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 插入数据工作正常。有什么想法吗?

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-02-24
        • 2017-10-25
        • 2018-10-19
        • 2016-09-10
        • 2018-11-23
        • 1970-01-01
        • 2017-07-01
        • 2017-11-26
        • 2017-04-19
        相关资源
        最近更新 更多