2017-01-19 4 views
0

私はUserControllerコントローラでユーザーを作成するためのElixir/Phoenixアプリケーションを開発中です。 /lib/helpers/user_helpersディレクトリには、いくつかのモジュール(それぞれ別々のファイルにあります)があります。これらのモジュールはすべて共通の名前空間UserHelpers.ModuleNameを持っています。これらのモジュールのそれぞれに私はユーザデータに適用したいapplyという機能を持っています。たとえば、私は次のファイル構造がある場合:module1module2のそれぞれがuser_infoを返す関数apply(user_info)が含まれていElixirすべてのモジュールをネームスペースにリストする

-lib 
    -helpers 
     -user_helpers 
      -module1 
      -module2 
      -... 
      -moduleN-1 
      -moduleN 

を。私のUserControllerでは、私は次のことを実行したい機能create(conn, params)あります

user_data 
|> UserHelpers.Module1.create 
|> UserHelpers.Module2.create 
|> ... 
|> UserHelpers.ModuleN-1.create 
|> UserHelpers.ModuleN.create 

をしかし、私は動的に上記を行うためにUserHelpersフォルダ内のすべてのモジュールをロードする方法がわかりませんよ。助言がありますか?

with {:ok, list} <- :application.get_key(:my_app, :modules) do 
    list 
    |> Enum.filter(& &1 |> Module.split |> Enum.take(1) == ~w|UserHelpers|) 
    |> Enum.reduce(user_data, fn m, acc -> apply(m, :create, acc) end) 
end 

:application.get_key(:my_app, :modules)は、そのアプリケーションに知られている、モジュールのリストを返します:アプリケーションが:my_appと呼ばれ、ヘルパーは.ex拡張子を持っている、および/または明示的に、アプリケーションにコンパイルされていることを、仮定し

+0

これらのモジュールはあなたのアプリにコンパイルされていますか(つまり、それらは '.ex'ファイルであり、' .exs'ではありません)? – Dogbert

+0

そして、どのような順序でこれらを呼びたいのですか?モジュール名は数字で終わりますか? N> 9です(この場合、 'Enum.sort'で十分ではありません)。 – Dogbert

答えて

5

。 2行目は不要なものをフィルタリングし、後者は後で:createの機能をuser_dataに適用します。

最後の行の直前にEnum.sortを埋め込んで、モジュールを適切な順序で並べ替えることができます。

関連する問題