Как получить значение переменной из файлов окружения в Phoenix?

Я развертываю свое первое приложение Phoenix, и я указал значения переменной в своих файлах среды (dev.exs и prod.exs).

Теперь я пытаюсь выяснить, как получить доступ к ним в моих контроллерах.

# config/dev.exs
config :my_app, MyApp.Endpoint,
  http: [port: 4000],
  debug_errors: true,
  cache_static_lookup: false,
  my_var: "DEVELOPMENT VALUE"

# config/prod.exs
config :my_app, MyApp.Endpoint,
  http: [port: {:system, "PORT"}],
  url: [host: "example.com"],
  my_var: "PRODUCTION VALUE"

Ответы

Ответ 1

Хорошо, нашел что-то. Эликсир Application.get_env/3 - это путь:

get_env (приложение, ключ, по умолчанию \\nil)


Но проблема в том, что команда accessor становится очень длинной для текущей ситуации:

# Set value in config/some_env_file.exs
config :my_large_app_name, MyLargeAppName.Endpoint,
  http: [port: {:system, "PORT"}],
  url: [host: "example.com"],
  my_var: "MY ENV VARIABLE"

# Get it back
Application.get_env(:my_large_app_name, MyLargeAppName.Endpoint)[:my_var]

Лучшим способом было бы определить их в отдельном разделе:

config :app_vars,
  a_string: "Some String",
  some_list: [a: 1, b: 2, c: 3], 
  another_bool: true

и получить доступ к ним следующим образом:

Application.get_env(:app_vars, :a_string)
# => "Some String"

Или вы можете получить list всех пар ключ-значение:

Application.get_all_env(:app_vars)           
# => [a_string: "Some String", some_list: [a: 1, b: 2, c: 3], another_bool: true]

Ответ 2

У меня была ошибка с решением @sheharyar, поэтому здесь означают:

Мне пришлось создать новый блок без MyLargeAppName.Endpoint,

# Set value in config/some_env_file.exs
config :my_large_app_name,
  my_var: "MY ENV VARIABLE"

а затем в вашем коде

Application.get_env(:my_large_app_name, :my_var)

ПРЕДУПРЕЖДЕНИЕ: поскольку @Хосе Валим сказал, что вы не можете установить какое-либо имя в качестве ключевого :my_large_app_name, оно должно быть таким же из вашего проекта