长生不老药:__使用__/1是未定义的或私有的 [英] Elixir: __using__/1 is undefined or private

查看:15
本文介绍了长生不老药:__使用__/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是未定义的或私有的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆