2015-04-23 9 views
5

Bazı yollarda belirli bir kısıtlama belirlemek için bazı IP adreslerini tedarik etmeliyim. Bu verileri, bir yapılandırma dosyasından, rota dosyasında harcalamaya gerek olmadan almanın bir yolu var mı? yani normalde ben yapabileceğiniAPP_CONFIG ['var'] rotalarının içinde mi? veya değişkenler ile tedarik yolları?

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

:

Im gibi uygulama değişkenleri için bir yaml dosyası ve başlatıcı kullanılarak bu routes.rb başarısız

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

orada bir yol Bunu düzeltmek için ?

+0

Rota dosyasında "APP_CONFIG" yi incelediğinizde ne olur? –

cevap

0

Rayların başlangıç ​​işlemine göz atın (http://guides.rubyonrails.org/initialization.html). Yönlendirmenin aslında çok erken (ve application.rb veya diğer başlatıcılardan daha erken) yüklendiğini göreceksiniz. Bu yüzden bu dosyayı henüz yüklememiş. Bu turda

bir yolu boot.rb içine bu yerleştirmek olacaktır:

# 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

Bunun bir yan etkisi var mı? Çözümünüz doğru görünüyor ama korkarım ki yan şartlar var, ancak doğru cevap olarak büyük olacak. – Rubytastic

+0

Bu da 'yaml' gerektirir ve yine de Rails.root üzerinde başarısız olur, çünkü ': başlatılmamış sabit Raylar (NameError) – Rubytastic

+0

Sonra ekleme' raylar 'gerektirir WARN gibi daha fazla hata atar: Çözümlenmemiş Gem :: Specification.reset sırasında özellikleri: Yani bu çözülemeyecek gibi görünüyor. Belki de rotalara izin vermeliyim, ancak kontrolör seviyesinde sadece kimlik doğrulaması yapmalıyım. Rotaları kesmek daha iyi olurdu. Bir fikir olan var mı? – Rubytastic

1

routes.rb dosya bir kez örneği ve belleğe yüklenir yakut dosyasıdır.

sadece içindeki yakut kod ekleyebilirsiniz ve bir kez çalıştırılacaktır:

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 

Bu raylar yolları Uygulamanın tamamında YML ve kullanılabilir yüklenen değişkenle routes.rb dosyayı örneğini. Env değişkeni kullanmanıza bile gerek yoktur. Yerel değişken daha iyi bir fikir gibi görünüyor.

Ayrıca iç mantığı koymak ve bu ortamı bağımlı yapabilir:

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

Sana bir yükleme sırası sorunu çalışan inanıyoruz. Muhtemelen bu konuda hack olabilirsiniz, ancak ...

Bu sorunu çözmek için Figaro'yu kullanmanızı şiddetle tavsiye ederim. Özellikle raylar konfigürasyonu için tasarlanmış ve 12 faktörlü uygulama dağıtımıyla (Heroku gibi) güzel çalışacak bir mücevher: https://github.com/laserlemon/figaro

Şu anda üzerinde çalıştığım uygulamada Figaro kullanıyorum ve env değişkenlerine erişimi onayladım. güzergahlarımın içinde. Bu gemin, mevcut sorununuzu ve henüz bilmediğiniz diğer yapılandırma sorunlarını çözeceğine inanıyorum!

İlgili konular