本文介绍了长生不老药:__使用__/1是未定义的或私有的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用的是Elixir+Phoenix 1.3,并且已经定义了Accounts
上下文。我想使用accounts.ex
文件作为其他模块中所需的索引,以防止它变得太大,但从我创建的其他模块导入函数时遇到了问题。
我的文件结构如下:
lib
|- Project
|- Accounts
|- accounts.ex
|- user_api.ex
我的accounts.ex
文件是这样的:
# accounts.ex
defmodule Project.Accounts do
@moduledoc """
The Accounts context.
"""
import Ev2Web
import Ecto.Query, warn: false
alias Project.{Accounts}
use Accounts.UserAPI
end
这是我尝试导入的模块:
# user_api.ex
defmodule Project.Accounts.UserAPI do
alias Project.{Repo}
alias Project.{Accounts.User}
def list_users do
Repo.all(User)
end
end
我希望能够导入Project.Accounts.UserAPI
模块,以便可以在控制器中引用Project.Accounts.list_users()
,但没有导入模块。我收到错误function Project.Accounts.UserAPI.__using__/1 is undefined or private
。我的控制器如下所示:
defmodule ProjectWeb.UserController do
use ProjectWeb, :controller
alias Project.Accounts
def index(conn, _params) do
users = Accounts.list_users()
render(conn, "index.html", users: users)
end
end
有人知道如何将一个模块中的所有函数导入到另一个模块中以便可以使用吗?提前感谢!
推荐答案
您必须包含__using__
宏,并将所有应编译到Using模块中的代码放入其中。如下所示:
defmodule Project.Accounts.UserAPI do
defmacro __using__(_) do
quote do
alias Project.{Repo}
alias Project.{Accounts.User}
def list_users do
Repo.all(User)
end
end
end
end
这篇关于长生不老药:__使用__/1是未定义的或私有的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!