【问题标题】:Elixir: __using__/1 is undefined or privateElixir:__using__/1 未定义或私有
【发布时间】:2017-11-07 15:36:25
【问题描述】:

我正在使用 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

有谁知道如何将一个模块中的所有功能导入另一个模块以便它们可以使用?提前致谢!

【问题讨论】:

  • 试试import而不是use
  • @Dogbert 我试过了,但我的控制器仍然无法访问我的功能

标签: elixir phoenix-framework


【解决方案1】:

您必须包含__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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-16
    • 2021-08-28
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多