我使用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
是否有人知道如何将所有功能从一个模块导入另一个模块以便可以使用?提前谢谢!
答案 0 :(得分:2)
您必须包含__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