2017-11-07 6 views
2

私はElixir + Phoenix 1.3を使用しており、Accountsのコンテキストを定義しています。私はaccounts.exファイルをインデックスとして使用して、他のモジュールでそれが大きくなりすぎないようにするために必要としましたが、作成した他のモジュールから関数をインポートする際に問題があります。エリクサー:__using __/1は定義されていないかプライベートです

次のように私のファイルの構造は次のとおりです。

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

'use'ではなく' import'を試しますか? – Dogbert

+0

@Dogbert私はそれを試みたが、私の機能は私のコントローラからまだアクセスできなかった –

答えて

1

__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

ありがとう@Phillipp働いた! –

関連する問題