Raylarda özel yapılandırma değişkenleri nasıl tanımlanır


337

Bir raylar uygulamasına özel yapılandırma değişkenleri nasıl ekleyeceğinizi ve denetleyicide bunlara nasıl erişileceğini merak ediyordum, örneğin, yapılandırma dosyalarında bir upload_directory tanımlamak istiyorum development.rb ve bunlardan birinde erişebiliyorum kontrolörleri.

İkincisi, s3 erişimi, gizli anahtarı olan bir yaml dosyası eklemek istersem uygulamamda yüklemeler için S3 desteğine sahip olmayı planlıyordum, Rails Uygulamamda nasıl başlatırım ve tanımladığım değerlere nasıl erişirim bu yapılandırma dosyasında.



Biraz ilgili: Yeni yapılandırma değişkenleri eklerken sunucuyu yeniden başlatmayı unutmayın.
Damien Ó Ceallaigh

Yanıtlar:


165

Güncelleme 1

Çok önerilen: Bugünlerde sağladığı ince taneli kontrol için Rails Config gem ile gidiyorum .

Update2

Hızlı bir çözüm istiyorsanız, Jack Pratt'ın cevabını aşağıdan kontrol edin .

Aşağıdaki orijinal cevabım hala çalışıyor olsa da, bu cevap şimdi modası geçmiş. Güncelleme 1 ve 2'ye bakmanızı tavsiye ederim.

Orijinal Yanıt:

Hızlı bir çözüm için Ryan Bates tarafından yayınlanan "YAML Yapılandırma Dosyası" ekranını izlemek çok yardımcı olacaktır.

Özetle:

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

# application.rb
if APP_CONFIG['perform_authentication']
  # Do stuff
end

62
Bu cevap eski. Bkz stackoverflow.com/questions/1450285/... altında
mattwynne

8
@matt: Rails 3 yayınlandığı için mi, yoksa herkes şimdi Rails 3'te mi olduğu için mi yoksa ...?
Lasse V. Karlsen

Eski olanı işaret ettiğiniz için teşekkür ederiz. Rails hakkında nefret ediyorum - 1 yıl önceki kod çok eski.
jcollum

2
Raylar 3+ içinde YAML yöntemi kullanmak isteyen herkes için, değiştirmek gerekecek RAILS_ENVile Rails.envve RAILS_ROOTile Rails.root.
Ryan

Rails_config denedim. Belgelerde bana app.rb dosyamda RailsConfig dosyasını kaydetmem talimatı verildi. Ben app.rb = config / application.rb olduğunu varsayalım. Ancak application.rb dosyasında RailsConfig yazmacını nereye koymalıyım?
Nhím Hổ Báo

375

Rails 3'te, uygulamaya özel özel yapılandırma verileri uygulama yapılandırma nesnesine yerleştirilebilir. Yapılandırma başlatma dosyalarına veya ortam dosyalarına atanabilir - belirli bir uygulama için deyin MyApp:

MyApp::Application.config.custom_config_variable = :my_config_setting

veya

Rails.configuration.custom_config_variable = :my_config_setting

Ayarı okumak için yapılandırma değişkenini ayarlamadan çağırmanız yeterlidir:

Rails.configuration.custom_config_variable
=> :my_config_setting

GÜNCELLEME Rayları 4

Rails 4'te bunun için yeni bir yol var => http://guides.rubyonrails.org/configuring.html#custom-configuration

resim açıklamasını buraya girin


11
Benim için çalışıyor. Ortama özgü yapılandırma ayarlarımı ortamlar / {ortam} .rb, örneğin ortamlar / development.rb içine koydum. Değiştirdikten sonra sunucunuzu yeniden başlattığınızdan emin olun. Daha şık teknikler olabilir, ancak daha önce aynı dosyada ENV ['XXX'] kullanan mevcut bir uygulamayı yeni sürüme geçiriyorum ve yükseltme sırasında yeniden düzenleme miktarını sınırlamak istediğimden, bu iyi çalıştı.
pduey

13
Bu bir ödevdir, ancak bu değere nasıl erişirsiniz?
kevzettler

9
Rails 3.x app application.rb bakarsanız, bu uygulama göre "Uygulama yapılandırması config / başlatıcıları dosyalara gitmek gerekir" sais. Değişkene nasıl erişileceğiyle ilgili birçok belge vardır ( edgeguides.rubyonrails.org/configuring.html ). Örneğin, başlatıcılar klasöründe some_variables.rb adlı bir dosyada, değişkeni yukarıda açıklandığı gibi yerleştirin (Uygulamamı uygulamanızın adıyla değiştirerek) kullanmak istediğinizde sadece config.custom_config_variable'ı arayın İstediğiniz değişken adını elbette kullanabilirsiniz . @Jack Pratt daha eksiksiz bir cevabı düzenleyebilir misiniz?
jamesc

48
Dostum, basit: Yol: config/environments/production.rb Config: config.whatever = false Her yerden erişin: Rails.configuration.whatever
Victor S

5
Sadece üretimde bir şey ayarlarsanız ve başka bir ortamda erişmeye çalışırsanız, bunun şikayet edeceğini unutmayın undefined method.
lulalala

69

Rails 3.0.5'te, aşağıdaki yaklaşım benim için çalıştı:

Içinde config/environments/development.rb, yaz

config.custom_config_key = :config_value

Değer custom_config_keydaha sonra diğer dosyalardan başvurulabilir.

Rails.application.config.custom_config_key

4
Sadece üretimde bir şey ayarlarsanız ve başka bir ortamda erişmeye çalışırsanız, bunun şikayet edeceğini unutmayın undefined method.
lulalala

Bunu raylar 4.1'de denedim ve hatalar alıyorum, " method_missing': undefined method # <Rails :: Application :: Configuration: 0x007f9f735b7240> ..." için saklayın. "Config.store.works" yapılandırma değişkeni eklemeye çalışıyordum.
Spundun

1
@Spundun Bu hatayı alıyorsunuz, çünkü Rails ne storeolduğunu bilmiyor . Bu yanıttaki yöntemi kullanmak için, değişkeninizi yeniden adlandırabilir store_worksveya burada tanımlanmış bir config.storeblok oluşturabilirsiniz works.
Paul Pettengill

Teşekkürler, sonunda bunu anladım. Bu, iç içe geçmiş karma olduğunu, bu yüzden yapılandırma adlarımda noktalar kullanacak olursam boş karmaları yinelemeli olarak başlatmam gerekir.
Spundun

31

Bu raylar 3.1 çalışır:

belirli bir ortamı hedeflemek için config / environment.rb (veya config / environment / .. dizininde)

YourApp::Application.config.yourKey = 'foo'

Bu, denetleyicide veya aşağıdaki görünümlerde erişilebilir olacaktır:

YourApp::Application.config.yourKey

(Uygulamanızın yerine uygulama adınız gelmelidir.)

Not : Ruby kodudur, bu nedenle çok sayıda yapılandırma anahtarınız varsa, bunu yapabilirsiniz:

config / environment.rb içinde:

YourApp::Application.configure do
  config.something = foo
  config.....
  config....
  .
  config....
end

2
camelCase: o snake_case kullanın!
siegy22

30

Raylarda 4

Özel değişkenlerinizi bir yaml dosyasına koyduğunuzu varsayarsak:

# config/acme.yml
development:
  :api_user: 'joe'
  :api_pass: 's4cret'
  :timeout: 20

Bunları yüklemek için bir başlatıcı oluşturun:

# config/initializers/acme.rb
acme_config = Rails.application.config_for :acme

Rails.application.configure do
  config.acme = ActiveSupport::OrderedOptions.new
  config.acme.api_user = acme_config[:api_user]
  config.acme.api_pass = acme_config[:api_pass]
  config.acme.timeout  = acme_config[:timeout]
end

Artık uygulamanızın herhangi bir yerine şu değerlere erişebilirsiniz:

Rails.configuration.acme.api_user

O uygundur Rails.application.config_for :acmeyük senin olacak acme.ymlve doğru ortamı kullanın.


21

Raylar 4.2 kaldığından ilave taşlar olmadan, sen yükleyebilirsiniz hi.yml / config basitçe kullanarak Rails.application.config_for :hi.

Örneğin:

  1. touch config/passwords.yml

        #config/passwords.yml
        development:
          username: 'a'
          password: 'b'
        production:
          username: 'aa'
          password: 'bb'
  1. touch config/initializers/constants.rb

    #config/initializers/constants.rb
    AUTHENTICATION = Rails.application.config_for :passwords
  1. ve artık AUTHENTICATIONuygulamanızın her yerinde sabit kullanabilirsiniz :

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
  2. Daha sonra eklemek passwords.yml için .gitignore : echo /config/passwords.yml >> .gitignore, rahatınız için bir örnek dosyası oluşturmak cp /config/passwords.yml /config/passwords.example.ymlve sonra sadece fiili üretim değerleri ile üretim konsolunda örnek dosyasını düzenlemek.


13

Bunu Rails 4.2'deki en son harika şeyler için güncellemek istedim, şimdi bunu config/**/*.rbdosyalarınızdan herhangi birinde yapabilirsiniz :

config.x.whatever.you.want = 42

... ve bu, uygulamanızda şu şekilde kullanılabilir:

Rails.configuration.x.whatever.you.want

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



4

YAML ayarları için basit bir eklenti oluşturdum: Yettings

Khelll'nin cevabındaki koda benzer şekilde çalışır, ancak sadece bu YAML yapılandırma dosyasını eklemeniz gerekir:

app/config/yetting.yml

Eklenti, YML ayarlarına uygulamanızda şu şekilde sınıf yöntemleri olarak erişmenizi sağlayan bir sınıf oluşturur:

Yetting.your_setting

Ayrıca, benzersiz adlara sahip birden fazla ayar dosyası kullanmak istiyorsanız, bunları app / config içindeki bir alt dizine şu şekilde yerleştirebilirsiniz:

app/config/yettings/first.yml
app/config/yettings/second.yml

Ardından şu değerlere erişebilirsiniz:

FirstYetting.your_setting
SecondYetting.your_setting

Ayrıca, ortam başına geçersiz kılınabilecek varsayılan ayarları da sağlar. Yml dosyasının içinde erb de kullanabilirsiniz.


Resmi repo şu anda: github.com/charlotte-ruby/yettings (SO incelemesi çok küçük olduğunu söyleyerek düzenlememi reddetti)
lulalala


4

Heroku kullanıyorsanız veya uygulama ayarlarınızı ortam değişkenleri olarak tutmanız gerekiyorsa, figaro mücevher çok yardımcı olur.


2

Web arayüzü üzerinden değiştirilebilir olması gereken global yapılandırma değerleri için ray ayarları kullanmayı seviyorum .


2
Rayları öğrendiğim için ek eklentiler vs kullanmak istiyorum, bu yüzden bunu yapmanın en iyi yolu herhangi bir eklenti olmadan olurdu.
Shiv

Bunun, bazı insanlar için çok ağır olan yapılandırmaları depolamak için veritabanı kullandığını unutmayın.
lulalala

0

İş yerinde yapmaya başladığımız bir şey ActiveSupport Sipariş Edilen Karma

Bu, yapılandırmanızı ortam dosyalarında temiz bir şekilde tanımlamanıza olanak tanır.

config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']

-5

Uygulamanızdaki yapılandırmayla nasıl başa çıkacağınızı iyi bir şekilde öneriyorum. Üç temel kural vardır:

  • yapılandırmanızı bir kod değil;
  • koşullar üzerinde yapılandırmaları kullanma;
  • bir şey ifade eden kod yaz.

Daha ayrıntılı bir genel bakış için bu bağlantıyı izleyin: Yapılandırmayı doğru şekilde raylayın

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.