web-dev-qa-db-ja.com

フェニックスの環境ファイルから変数値を取得するにはどうすればよいですか?

私は最初のフェニックスアプリケーションをデプロイしており、環境ファイル(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"
18
Sheharyar

わかりました、何かを見つけました。 エリクサーApplication.get_env/3は次の方法です。

get_env(app、key、default \\ nil)


しかし、これの問題は、現在の状況ではアクセサコマンドが非常に長くなることです。

# 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]
24
Sheharyar

私は@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)

警告:@JoséValimがキーとして名前を設定することはできません:my_large_app_nameプロジェクトと同じである必要があります

2
douarbou