2017-01-19 31 views
0

我正在製作一個Elixir/Phoenix應用程序,用於在我的UserController控制器中創建用戶。有一個/lib/helpers/user_helpers目錄有許多模塊(每個都在一個單獨的文件中)。這些模塊都有一個通用名稱空間UserHelpers.ModuleName。在這些模塊中的每一箇中,我都有一個名爲apply的函數,我想將其應用於用戶數據。例如,如果我有以下文件結構:Elixir列出名稱空間中的所有模塊

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

,其中每個的module1module2包含一個函數apply(user_info)返回user_info。在我UserController我有,我想運行下面的功能create(conn, params)

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

但我不確定如何動態地加載所有的文件夾UserHelpers模塊的上面做。有什麼建議麼?

+0

這些模塊是否被編譯到您的應用程序中(即它們是否在'.ex'文件中,而不是'.exs')? – Dogbert

+0

你想以什麼順序調用這些命令?模塊名稱是否以數字結尾? N> 9(在這種情況下'Enum.sort'不夠用)。 – Dogbert

回答

5

假設,你的應用程序被稱爲:my_app和助手有.ex延伸和/或明確編譯到應用程序:

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)返回模塊列表,知道該應用程序。第二行過濾掉那些不需要的內容,後者將其:create函數隨後應用於user_data

您可能想要在最後一行之前嵌入Enum.sort,以便按適當的順序對模塊進行排序。

相關問題