2017-01-19 32 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,以便按适当的顺序对模块进行排序。

相关问题