2017-01-19 8 views
0

Я работаю над приложением Elixir/Phoenix, предназначенным для создания пользователя в моем контроллере UserController. Существует каталог /lib/helpers/user_helpers с рядом модулей (каждый в отдельном файле). Все эти модули имеют общее пространство имен UserHelpers.ModuleName. В каждом из этих модулей у меня есть функция, называемая apply, которую я хочу применить к пользовательским данным. Например, если у меня есть следующая структура файла:Elixir Список всех модулей в пространстве имен

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

, где каждый из module1 и module2 содержит функцию, которая возвращает 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 непосредственно перед последней строкой, чтобы отсортировать модули для применения в соответствующем порядке.

 Смежные вопросы

  • Нет связанных вопросов^_^