Rails uygulamam için özel yapılandırma seçenekleri oluşturmanın en iyi yolu?


133

Rails uygulamam için bir yapılandırma seçeneği oluşturmam gerekiyor. Tüm ortamlar için aynı olabilir. Bunu belirlersem environment.rb, benim görüşlerimde mevcut olduğunu buldum, bu da tam olarak istediğim şey ...

environment.rb

AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda

Harika çalışıyor.

Ancak biraz tedirginim. Bunu yapmanın iyi bir yolu bu mu? Daha havalı bir yol var mı?

Yanıtlar:


191

Bir veritabanı tablosunda depolanması gerekmeyen genel uygulama yapılandırması config.ymliçin config dizini içinde bir dosya oluşturmayı seviyorum . Örneğiniz için şöyle görünebilir:

defaults: &defaults
  audiocast_uri_format: http://blablalba/blabbitybla/yadda

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults

Bu yapılandırma dosyası, yapılandırma / başlatıcılardaki özel bir başlatıcıdan yüklenir :

# Rails 2
APP_CONFIG = YAML.load_file("#{RAILS_ROOT}/config/config.yml")[RAILS_ENV]

# Rails 3+
APP_CONFIG = YAML.load_file(Rails.root.join('config/config.yml'))[Rails.env]

Rails 3 kullanıyorsanız, ilgili yapılandırma yolunuza yanlışlıkla bir eğik çizgi eklemediğinizden emin olun.

Daha sonra aşağıdaki komutu kullanarak değeri alabilirsiniz:

uri_format = APP_CONFIG['audiocast_uri_format']

Tüm ayrıntılar için bu Railscast'e bakın.


1
Bunun stackoverflow.com/a/6140900/414220YAML::ENGINE.yamler = 'syck' ile çalışması için ihtiyacınız olabilir
evanrmurphy

45
Sadece bilgi amaçlı, Rails değiştirmek gerekir 3.x RAILS_ENVile Rails.envve RAILS_ROOTile Rails.root.
JeanMertz

5
Rails 3+ için mutlak değil göreli yolu birleştirmelisiniz. Yapılandırma dizininin önüne eğik çizgi koymayın.
wst

10
Önceki sürümlerden emin değilim ama Rails 4.1'de şunları yapabilirsinizRails.application.config.whatever_you_want = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env]
d4rky

2
@ iphone007, gerçekten de yapılandırma dizininden rastgele yaml dosyalarını yüklemek mümkündür. bkz smathy yanıtını Bence artık kabul cevap olması gereken aşağıda.
omnikron

82

Başlatıcı kodunun Rails 3 sürümü aşağıdaki gibidir (RAILS_ROOT & RAILS_ENV kullanımdan kaldırılmıştır)

APP_CONFIG = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env]

Ayrıca Ruby 1.9.3, birleştirme anahtarlarını büyük / küçük harfe duyarlı hale getiren Psych kullanır; bu nedenle, bunu hesaba katmak için yapılandırma dosyanızı değiştirmeniz gerekir, örn.

defaults: &DEFAULTS
  audiocast_uri_format: http://blablalba/blabbitybla/yadda

development:
  <<: *DEFAULTS

test:
  <<: *DEFAULTS

production:
  <<: *DEFAULTS

3
İhtiyacın yok "#{Rails.root.to_s}"; "#{Rails.root}"İşler.
David J.

3
Rails.root.join('config', 'config.yml')"#{Rails.root.to_s}/config/config.yml"
David J.

2
Ve, APP_CONFIG yerine şunu kullanmanızı tavsiye ederim:AppName::Application.config.custom
David J.

1
David, ilk iki yorumun en iyi uygulama ve ben kodu değiştireceğim ama sonuncusunu dışarıda bırakacağım çünkü bu, bu kodu her kullandığında AppName'i değiştirmeyi hatırlaman gerektiği anlamına geliyor.
David Burrows

53

Raylar> = 4.2

Sadece oluşturmak YAMLdosyayı config/örneğin dizindeki: config/neo4j.yml.

İçeriği neo4j.ymlaşağıdaki gibi olabilir (Basit olması için tüm ortamlar için varsayılanı kullandım):

default: &default
  host: localhost
  port: 7474
  username: neo4j
  password: root

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default

içinde config/application.rb:

module MyApp
  class Application < Rails::Application
    config.neo4j = config_for(:neo4j)
  end
end

Şimdi, özel yapılandırmanıza aşağıdaki gibi erişilebilir:

Rails.configuration.neo4j['host'] #=>localhost
Rails.configuration.neo4j['port'] #=>7474

Daha fazla bilgi

Rails resmi API belgesi config_foryöntemi şu şekilde açıklar :

Mevcut Rails env. İçin config / foo.yml dosyasını yüklemek için kolaylık.


Bir yamldosya kullanmak istemiyorsanız

Rails resmi kılavuzunun dediği gibi:

config.xÖzellik altında özel yapılandırma ile Rails yapılandırma nesnesi aracılığıyla kendi kodunuzu yapılandırabilirsiniz .

Misal

config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries  = 3
config.x.super_debugger = true

Bu yapılandırma noktaları daha sonra yapılandırma nesnesi aracılığıyla kullanılabilir:

Rails.configuration.x.payment_processing.schedule # => :daily
Rails.configuration.x.payment_processing.retries  # => 3
Rails.configuration.x.super_debugger              # => true
Rails.configuration.x.super_debugger.not_set      # => nil

config_forYöntem için Resmi Referans | Resmi Ray Kılavuzu


25

1. Adım: config / initializers / appconfig.rb oluşturun

require 'ostruct'
require 'yaml'

all_config = YAML.load_file("#{Rails.root}/config/config.yml") || {}
env_config = all_config[Rails.env] || {}
AppConfig = OpenStruct.new(env_config)

2. Adım: config / config.yml oluşturun

common: &common
  facebook:
    key: 'asdjhasxas'
    secret : 'xyz'
  twitter:
    key: 'asdjhasxas'
    secret : 'abx'

development:
  <<: *common

test:
  <<: *common

production:
  <<: *common

Adım 3: Sabitleri kodun herhangi bir yerine getirin

facebook_key = AppConfig.facebook['key']
twitter_key  = AppConfig.twitter['key']

ENV değişkenini config.yml'de nasıl okuruz, yapılandırmam aynı .. bashrc'ye değişken ekledim ve bunu config.yml'de anahtar kullanarak okumaya çalışıyorum: <% = ENV [URL]%> ... bu çalışmıyor
shiva

@shiva ENV değişkenleri için Figaro gem'e bakın. Bu yapılandırma kurulumu, kaynak kontrolünden gizlenmesi gerekmeyen değerler içindir.
Shadoath

17

Bunu sadece Rails 4.2 ve 5'teki en son harika şeyler için güncellemek istedim, artık bunu config/**/*.rbdosyalarınızın herhangi birinin içinde yapabilirsiniz :

config.x.whatever = 42

(ve bu birebirdir x, yani config.x.kelimenin tam anlamıyla bu olmalıdır ve sonra istediğiniz her şeyi ekleyebilirsiniz x)

... ve bu, uygulamanızda şu şekilde mevcut olacaktır:

Rails.configuration.x.whatever

Daha fazlasını burada görün: http://guides.rubyonrails.org/configuring.html#custom-configuration


3
Başlangıçta benim için sorun yaratan bir açıklama; x, koymak istediğiniz her şey için bir yer tutucu değil, gerçekten harf olması gerekiyor x.
tobinibot

Harika nokta @tobinibot - Cevabıma bu açıklamayı ekledim, teşekkürler.
smathy

Kılavuzların aslında "x" işaretinden bahsetmemesi ilginç, ancak Rails 5.0
Don

Haklısın Don, bu garip - eminim eskiden söylerdi.
smathy

1
Güncel raylar belgelerinden: You can configure your own code through the Rails configuration object with custom configuration under either the config.x namespace, or config directly. The key difference between these two is that you should be using config.x if you are defining nested configuration (ex: config.x.nested.nested.hi), and just config for single level configuration (ex: config.hello).Kaynak: guides.rubyonrails.org/configuring.html#custom-configuration
David Gay

6

Bu konuyla ilgili birkaç ekstra bilgi:

APP_CONFIG = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env].with_indifferent_access

".with_indifferent_access", karma içindeki değerlere bir dize anahtarı veya eşdeğer bir sembol anahtarı kullanarak erişmenizi sağlar.

Örneğin.
APP_CONFIG['audiocast_uri_format'] => 'http://blablalba/blabbitybla/yadda' APP_CONFIG[:audiocast_uri_format] => 'http://blablalba/blabbitybla/yadda'

Tamamen kolaylık sağlayan bir şey, ancak anahtarlarımın semboller olarak gösterilmesini tercih ederim.


5

John for Rails 3.0 / 3.1'e benzer bir şey kullanıyorum, ancak önce dosyayı ayrıştırmam gerekiyor:

APP_CONFIG = YAML.load(ERB.new(File.new(File.expand_path('../config.yml', __FILE__)).read).result)[Rails.env]

Bu, heroku'nun redistogo url'sini okumak gibi, gerekirse yapılandırmamda ERB kullanmama izin verir:

production:
  <<: *default
  redis:                  <%= ENV['REDISTOGO_URL'] %>

2
Buna her gün ihtiyacım olacağını sanmıyorum, ancak ihtiyaç duyduğunuz zamanlar için bu gerçekten harika bir çözüm. Sanırım dosya adını config.yml.erb olarak değiştirirdim, ancak raylar kuralına uyacak şekilde.
Andrew Burns

2

Rails 4

Nasıl yapıldığına benzer şekilde özel bir yapılandırma yaml oluşturmak ve yüklemek (ve uygulamanıza sunmak) için database_configuration.

Sizin oluşturun *.yml, benim durumumda bir redis yapılandırma dosyasına ihtiyacım vardı.

config/redis.yml

default: &default
  host: localhost
  port: 6379

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default
  host: <%= ENV['ELASTICACHE_HOST'] %>
  port: <%= ENV['ELASTICACHE_PORT'] %>

Ardından yapılandırmayı yükleyin

config/application.rb

module MyApp
  class Application < Rails::Application

    ## http://guides.rubyonrails.org/configuring.html#initialization-events
    config.before_initialize do
      Rails.configuration.redis_configuration = YAML.load_file("#{Rails.root}/config/redis.yml")
    end

  end
end

Değerlere erişin:

Rails.configuration.redis_configuration[Rails.env]benzer size erişebilir nasıl database.ymlsaldırıdakiRails.configuration.database_configuration[Rails.env]


Ayrıca sadece zaten gerekmez muhtemelen sadece olanlardır mevcut ortamda ayarlarını, alarak kendinize biraz zaman kazanmak olabilir: Rails.configuration.redis_configuration = YAML.load_file("#{Rails.root}/config/redis.yml")[Rails.env]. Bununla birlikte, 4.2 ve üstü raylarda smathy'nin cevabı muhtemelen daha basit bir yoldur.
omnikron

1

Ömer Aslam'ın zarif çözümünü temel alarak anahtarları simgelere dönüştürmeye karar verdim. Tek değişiklik şudur:

all_config = YAML.load_file("#{Rails.root}/config/config.yml").with_indifferent_access || {}

Bu, daha sonra değerlere anahtarlar olarak sembollerle başvurmanıza olanak tanır, ör.

AppConfig[:twitter][:key]

Bu gözlerime daha temiz geliyor.

(İtibarım Ömer'in cevabına yorum yapacak kadar yüksek olmadığından bir cevap olarak gönderildi)




0

Ayarlara global uygulama yığını aracılığıyla erişmeyi tercih ederim. Yerel kapsamda aşırı global değişkenlerden kaçınırım.

yapılandırma / başlatıcılar / myconfig.rb

MyAppName::Application.define_singleton_method("myconfig") {YAML.load_file("#{Rails.root}/config/myconfig.yml") || {}}

Ve ile erişin.

MyAppName::Application.myconfig["yamlstuff"]

0

Rails başlatılmadan önce Ayarları yükleme yolum

Rails başlatmadaki ayarları kullanmanıza ve ortam başına ayarları yapılandırmanıza izin verir

# config/application.rb
Bundler.require(*Rails.groups)

mode = ENV['RAILS_ENV'] || 'development'
file = File.dirname(__FILE__).concat('/settings.yml')
Settings = YAML.load_file(file).fetch(mode)
Settings.define_singleton_method(:method_missing) {|name| self.fetch(name.to_s, nil)}

Ayarları iki şekilde alabilirsiniz: Ayarlar ['e-posta'] veya Ayarlar.email


0

Özel yapılandırmanın en iyi yolu, setting.yml olduğunda yükseltilen mesaj eksik.

config / initializers / custom_config.rb içindeki özel bir başlatıcıdan yüklenir

setting_config = File.join(Rails.root,'config','setting.yml')
raise "#{setting_config} is missing!" unless File.exists? setting_config
config = YAML.load_file(setting_config)[Rails.env].symbolize_keys

@APP_ID = config[:app_id]
@APP_SECRET = config[:app_secret]

Config / setting.yml'de bir YAML oluşturun

development:
  app_id: 433387212345678
  app_secret: f43df96fc4f65904083b679412345678

test:
  app_id: 148166412121212
  app_secret: 7409bda8139554d11173a32222121212

production:
  app_id: 148166412121212
  app_secret: 7409bda8139554d11173a32222121212
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.