2015-04-23 7 views
5

Ho bisogno di fare in rails 4 fornire alcuni indirizzi IP per impostare un vincolo su determinate rotte. C'è un modo per ottenere questi dati da un file di configurazione senza averli codificati nel file di rotte?Accedi a APP_CONFIG ['var'] all'interno dei percorsi? o fornire percorsi con variabili?

Im utilizzando un file YAML e inizializzazione delle variabili app come:

APP_CONFIG = YAML.load_file("#{Rails.root}/config/application.yml")[Rails.env] 

così normalmente ho potuto fare:

constraints(:ip => %w[APP_CONFIG['app_url']]) do 
    .. my routes.. 
    end 

Questo fallisce nel routes.rb c'è un modo per risolvere questo problema ?

+0

cosa succede quando si controlla 'APP_CONFIG' nel file di rotte? –

risposta

0

Dai un'occhiata al processo di inizializzazione delle guide (http://guides.rubyonrails.org/initialization.html). Vedrai che il routing viene effettivamente caricato abbastanza presto (e prima di application.rb o altri inizializzatori). Pertanto non ha ancora caricato questo file.

Un modo tutto questo sarebbe di inserire questo nella vostra boot.rb:

# Set up gems listed in the Gemfile. 
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) 
#Now load app config: 
require 'yaml' 
APP_CONFIG = YAML.load_file(File.expand_path('../../config/application.yml', __FILE__)) 
+0

Questo avrebbe effetti collaterali? La tua soluzione sembra corretta, ma temo che abbia dei termini secondari, sarà grandiosa come la risposta corretta. – Rubytastic

+0

Ciò richiederebbe anche un 'yaml' e quindi non riesce ancora su Rails.root, perché ' ': Rails non inizializzato Rails (NameError) – Rubytastic

+0

Quindi aggiungendo require' rails 'genera più errori come WARN: irrisolto specifiche durante Gem :: Specification.reset: quindi sembra irrisolvibile. Forse dovrei consentire i percorsi ma semplicemente autenticarmi all'interno del livello del controller. Anche se tagliare le rotte sarebbe stato meglio. Qualcuno un'idea? – Rubytastic

1

Il file è un file routes.rb rubino che viene istanziato una volta, e caricato in memoria.

Si può solo aggiungere il codice ruby ​​al suo interno e che sarà eseguita una volta:

Rails.application.routes.draw do 
    app_config = YAML.load_file("#{Rails.root}/config/application.yml")[Rails.env] 
    constraints(:ip => %w[app_config['app_url']]) do 
    .. my routes.. 
    end 
end 

Ciò istanziare il file routes.rb con la variabile caricato dal yml e disponibile in tutto il vostro percorsi applicazione Rails. Non hai nemmeno bisogno di usare una variabile ENV. La variabile locale sembra un'idea migliore.

Si può anche mettere la logica interna e rendere l'ambiente dipendente:

if Rails.env.production? 
    app_config = YAML.load_file("#{Rails.root}/config/application.yml")[Rails.env] 
    constraints(:ip => %w[app_config['app_url']]) do 
    .. my routes.. 
    end 
else 
    .. my routes ... 
end 
0

Credo che si esegue in un problema di ordine di caricamento. Probabilmente si potrebbe incappare in questo, ma ...

Consiglio vivamente di utilizzare Figaro per risolvere questo problema. Si tratta di una gemma progettata appositamente per la configurazione delle rotaie e funzionerà bene con distribuzioni di app a 12 fattori (come Heroku): https://github.com/laserlemon/figaro

Sto utilizzando Figaro nell'app a cui sto lavorando attualmente e sono riuscito a confermare l'accesso alle variabili env all'interno del mio file di percorsi. Credo che questa gemma risolverà il tuo problema attuale e altri problemi di configurazione che non sai nemmeno di aver ancora!

Problemi correlati