2015-06-23 11 views
16

Sto distribuendo la mia prima applicazione Phoenix e ho specificato i valori di una variabile nei miei file di ambiente (dev.exs e prod.exs).Come ottenere un valore variabile dai file Ambiente in Phoenix?

Ora sto cercando di capire come accedervi nei miei Controller.

# 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" 

risposta

22

Ok, ho trovato qualcosa. Elixir'sApplication.get_env/3 è la strada da percorrere:

get_env(app, key, default \\ nil)


Ma il problema è che il comando di accesso diventa molto lungo per la situazione attuale:

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

Un modo migliore sarebbe definirli in una sezione separata:

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

e accedervi in ​​questo modo:

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

Oppure si potrebbe prendere un list di tutte le coppie chiave-valore :

+5

Informazioni su "il comando accessor diventa molto lungo": puoi sempre scrivere una funzione wrapper attorno a una lunga riga di codice che ripeti spesso. –

+0

Definirli sotto un nome di app diverso, più piccolo potrebbe essere un'altra opzione. Vedi la risposta aggiornata. – Sheharyar

+26

È necessario definire solo le configurazioni dell'applicazione per le applicazioni di propria proprietà. Se si esegue 'config: not_actuall_an_app,: key,: value', non è supportato e potrebbe presentarsi in alcune situazioni. –

2

Ho avuto qualche errore con la soluzione @sheharyar, quindi qui n:

ho dovuto creare nuovo blocco senza MyLargeAppName.Endpoint,

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

e poi nel codice

Application.get_env(:my_large_app_name, :my_var) 

ATTENZIONE: come @, ha detto José Valim non è possibile impostare un nome qualsiasi, come chiave :my_large_app_name esso deve essere lo stesso del tuo progetto

Problemi correlati