协议 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 未实现的主要内容,如果未能解决你的问题,请参考以下文章
(Protocol.UndefinedError) 协议 Enumerable 未实现 3
Phoenix/Elixir - 协议 Enumerable 未实现
iPhone SDK 警告:MyAppViewController 类未实现“UITabbarDelegate”协议