कैसे कस्टम विन्यास चर को रेल में परिभाषित करने के लिए


337

मैं सोच रहा था कि रेल विन्यास के लिए कस्टम कॉन्फ़िगरेशन चर कैसे जोड़े जा सकते हैं और नियंत्रक में उनका उपयोग कैसे किया जा सकता है, उदाहरण के लिए, मैं विन्यास फाइल में एक upload_directory को परिभाषित करने में सक्षम होना चाहता हूं। development.rb और मेरे एक में इसे एक्सेस करने में सक्षम होना चाहिए नियंत्रकों।

दूसरे मैं अपने आवेदन में अपलोड के लिए S3 का समर्थन करने की योजना बना रहा था, अगर मैं s3 पहुंच, गुप्त कुंजी के साथ एक yaml फ़ाइल जोड़ना चाहता था, तो मैं इसे अपने रेल ऐप में कैसे आरंभ करूं और मैं उन मानों का उपयोग कैसे करूं जिन्हें मैंने परिभाषित किया है। उस कॉन्फ़िग फ़ाइल में।



थोड़ा संबंधित: नए कॉन्फ़िगरेशन चर जोड़ते समय सर्वर को पुनरारंभ करना न भूलें।
डेमियन la सील्लाइग

जवाबों:


165

अपडेट १

बहुत अनुशंसित है: मैं आजकल ठीक से नियंत्रित नियंत्रण प्रदान करता है के लिए रेल विन्यास रत्न के साथ जा रहा हूँ ।

Update2

यदि आप एक त्वरित समाधान चाहते हैं, तो नीचे जैक प्रैट के उत्तर की जांच करें।

हालाँकि नीचे दिया गया मेरा मूल उत्तर अभी भी काम करता है, यह उत्तर अब पुराना हो चुका है। मैं 1 और 2 के अपडेट देखने की सलाह देता हूं।

मूल उत्तर:

एक त्वरित समाधान के लिए, रयान बेट्स द्वारा "यमर्ल कॉन्फ़िगरेशन फ़ाइल" स्क्रीन कास्ट देखना बहुत मददगार होना चाहिए।

संक्षेप में:

# 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
यह उत्तर आउट-डेटेड है। देखें stackoverflow.com/questions/1450285/... नीचे
mattwynne

8
@matt: क्या यह पुराना है क्योंकि रेल 3 जारी कर दी गई है, या क्योंकि सभी अब रेल 3 पर है, या ...?
लास वी। कार्लसन

आउटडेटेड इंगित करने के लिए धन्यवाद। मुझे नफरत है कि रेल के बारे में - 1 साल पहले से कोड बहुत पुराना है।
jcollum

2
रेल 3+ में YAML विधि का उपयोग करना चाहते हैं किसी को भी के लिए, आप प्रतिस्थापित करना होगा RAILS_ENVसाथ Rails.envऔर RAILS_ROOTसाथ Rails.root
रियान

मैंने rails_config की कोशिश की। प्रलेखन में वे मुझे अपने app.rb में RailsConfig को पंजीकृत करने का निर्देश देते हैं। मुझे लगता है कि app.rb = config / application.rb। लेकिन आवेदन में कहां। आरबी को मुझे रजिस्टर रेल्सफिग लाइन डालनी चाहिए?
Nhím H Nh Báo

375

रेल 3 में, एप्लिकेशन विशिष्ट कस्टम कॉन्फ़िगरेशन डेटा को एप्लिकेशन कॉन्फ़िगरेशन ऑब्जेक्ट में रखा जा सकता है। कॉन्फ़िगरेशन को आरंभीकरण फ़ाइलों या पर्यावरण फ़ाइलों में सौंपा जा सकता है - किसी दिए गए एप्लिकेशन के लिए कहें MyApp:

MyApp::Application.config.custom_config_variable = :my_config_setting

या

Rails.configuration.custom_config_variable = :my_config_setting

सेटिंग पढ़ने के लिए, बस इसे सेट किए बिना कॉन्फ़िगरेशन चर को कॉल करें:

Rails.configuration.custom_config_variable
=> :my_config_setting

अद्यतन रेल 4

रेल 4 में इसके लिए एक नया तरीका है => http://guides.rubyonrails.org/configuring.html#custom-configuration

यहां छवि विवरण दर्ज करें


11
इससे मेरा काम बनता है। मैंने वातावरण / {वातावरण} .rb, जैसे, वातावरण / विकास में अपनी पर्यावरण विशिष्ट विन्यास सेटिंग्स लगाईं। सुनिश्चित करें कि आप अपने सर्वर को संशोधित करने के बाद पुनः आरंभ करें। अधिक सुरुचिपूर्ण तकनीकें हो सकती हैं, लेकिन मैं एक मौजूदा ऐप को अपग्रेड कर रहा हूं जो पहले उसी फाइल में ENV ['XXX'] का उपयोग करता था, और चूंकि मैं अपग्रेड के दौरान रिफैक्टिंग की मात्रा को सीमित करना चाहता हूं, इसलिए यह अच्छी तरह से काम करता है।
pduey

13
यह असाइनमेंट है लेकिन आप इस मूल्य तक कैसे पहुँचते हैं?
केवज़टेलर

9
यदि आप एक रेलगाड़ी के अनुप्रयोग में देखते हैं। 3.x ऐप यह सैस करता है "एप्लिकेशन कॉन्फ़िगरेशन को इस उत्तर के अनुसार कॉन्फ़िगरेशन / इनिशियलाइज़र में फाइलों में जाना चाहिए"। चर का उपयोग कैसे करें ( edgeguides.rubyonrails.org/configuring.html ) पर बहुत सारे दस्तावेज हैं । जैसे फ़ाइल में some_variables.rb नामक इनिशियलाइज़र फ़ोल्डर में चर को ऊपर वर्णित किया गया है (अपने ऐप के नाम के साथ MyApp की जगह) तो जब आप इसका उपयोग करना चाहते हैं, तो बस config.custom_config_variable को कॉल करें जो भी आपको पसंद हो चर नाम का उपयोग कर सकते हैं । @ जैक प्रैट आप एक और अधिक पूर्ण उत्तर संपादित कर सकते हैं?
jamesc

48
यार, सरल: पथ: config/environments/production.rb विन्यास: config.whatever = false इसे कहीं भी एक्सेस करें: Rails.configuration.whatever
विक्टर एस

5
सावधान रहें कि यदि आप केवल उत्पादन में कुछ सेट करते हैं, और इसे दूसरे वातावरण में एक्सेस करने का प्रयास करते हैं, तो यह शिकायत करेगा undefined method
लुललाला

69

रेल 3.0.5 में, निम्नलिखित दृष्टिकोण ने मेरे लिए काम किया:

में config/environments/development.rb, लिखो

config.custom_config_key = :config_value

मान custom_config_keyका उपयोग करके अन्य फ़ाइलों से संदर्भित किया जा सकता है

Rails.application.config.custom_config_key

4
सावधान रहें कि यदि आप केवल उत्पादन में कुछ सेट करते हैं, और इसे दूसरे वातावरण में एक्सेस करने का प्रयास करते हैं, तो यह शिकायत करेगा undefined method
लुललाला

मैंने इसे ४.१ method_missing': undefined method रेलगाड़ियों में आज़माया और मुझे त्रुटियां हो रही हैं, " # स्टोर के लिए # <पटरियों :: अनुप्रयोग :: कॉन्फ़िगरेशन: ०x007f9f735b7240> ..."। मैं "config.store.works" कॉन्फ़िगरेशन चर जोड़ने की कोशिश कर रहा था।
स्पंदुन

1
@Spundun आपको वह त्रुटि मिल रही है, क्योंकि रेल को पता नहीं है कि क्या storeहै। इस उत्तर में विधि का उपयोग करने के लिए, आप या तो अपने चर का नाम बदल सकते हैं store_works, या परिभाषित के config.storeसाथ एक ब्लॉक बना सकते हैं works
पॉल पेटेंगेंगिल

धन्यवाद, मैं अंततः समझ गया। कि ये नेस्टेड हैश हैं इसलिए मुझे खाली हैश को फिर से इनिशियलाइज़ करना होगा अगर मैं अपने कॉन्फ़िगर नामों में डॉट्स का उपयोग करूं।
स्पंदुन

31

यह रेल 3.1 में काम करता है:

in config / environment.rb (या किसी विशिष्ट वातावरण को लक्षित करने के लिए config / वातावरण / .. में):

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

यह नियंत्रक या इस तरह के विचारों में सुलभ होगा:

YourApp::Application.config.yourKey

(आपका आवेदन आपके नाम से बदला जाना चाहिए।)

ध्यान दें : यह रूबी कोड है, इसलिए यदि आपके पास बहुत सी कॉन्फिग कीज़ हैं, तो आप ऐसा कर सकते हैं:

in config / environment.rb:

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

2
camelCase: o स्नेक_केस का उपयोग करें!
siegy22

30

रेल में ४

मान लें कि आपने अपने कस्टम चर को यमल फ़ाइल में डाल दिया है:

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

उन्हें लोड करने के लिए एक इनिशाइज़र बनाएँ:

# 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

अब आपके एप्लिकेशन में कहीं भी आप इन मूल्यों तक पहुँच सकते हैं जैसे:

Rails.configuration.acme.api_user

यह सुविधाजनक है जो Rails.application.config_for :acmeआपके लोड करेगा acme.ymlऔर सही वातावरण का उपयोग करेगा।


21

चूंकि रेल्स 4.2, अतिरिक्त रत्नों के बिना, आप केवल उपयोग करके कॉन्फिगर / hi.yml लोड कर सकते हैंRails.application.config_for :hi

उदाहरण के लिए:

  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. और अब आप AUTHENTICATIONअपने एप्लिकेशन में हर जगह निरंतर उपयोग कर सकते हैं :

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
  2. तो जोड़ने passwords.yml को .gitignore : echo /config/passwords.yml >> .gitignore, अपने आराम के लिए एक उदाहरण फ़ाइल बनाने cp /config/passwords.yml /config/passwords.example.ymlऔर फिर बस वास्तविक उत्पादन मूल्यों के साथ अपने उत्पादन कंसोल में अपने उदाहरण फ़ाइल को संपादित करें।


13

मैं अभी इसे रेल्स 4.2 में नवीनतम शांत सामग्री के लिए अद्यतन करना चाहता था, अब आप इसे अपनी किसी भी config/**/*.rbफाइल के अंदर कर सकते हैं :

config.x.whatever.you.want = 42

... और यह आपके ऐप में उपलब्ध होगा:

Rails.configuration.x.whatever.you.want

यहाँ और देखें: http://guides.rubyonrails.org/configuring.html#custom-configuration



4

मैंने YAML सेटिंग्स के लिए एक सरल प्लगइन बनाया: Yettings

यह कोडेल के उत्तर में कोड के समान फैशन में काम करता है, लेकिन आपको केवल इस YAML कॉन्फ़िगरेशन फ़ाइल को जोड़ना होगा:

app/config/yetting.yml

प्लगइन गतिशील रूप से एक वर्ग बनाता है जो आपको अपने ऐप में वाईएमएल सेटिंग्स को कक्षा के तरीकों के रूप में एक्सेस करने की अनुमति देता है:

Yetting.your_setting

इसके अलावा, यदि आप अद्वितीय नामों के साथ कई सेटिंग्स फ़ाइलों का उपयोग करना चाहते हैं, तो आप उन्हें इस तरह एप्लिकेशन / कॉन्फिग के अंदर एक उपनिर्देशिका में रख सकते हैं:

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

तब आप इस तरह से मानों तक पहुँच सकते हैं:

FirstYetting.your_setting
SecondYetting.your_setting

यह आपको डिफ़ॉल्ट सेटिंग्स भी प्रदान करता है जिसे प्रति वातावरण ओवरराइड किया जा सकता है। आप yml फ़ाइल के अंदर erb का भी उपयोग कर सकते हैं।


आधिकारिक रेपो अब यहां है: github.com/charlotte-ruby/yettings (SO समीक्षक ने मेरे संपादन को यह कहते हुए अस्वीकार कर दिया कि यह बहुत मामूली है)
lulalala

4

मुझे वास्तव में सेटिंग्सलॉजिकल रत्न पसंद है । स्थापित करने और उपयोग करने के लिए बहुत आसान है।

https://github.com/binarylogic/settingslogic


2
अब तक यह प्यार करना। अपनी सेटिंग ऑब्जेक्ट को ऐप / मॉडल / सेटिंग्स पर रखना ।rb आपको देव मोड में भी पुनः लोड करता है। जीत!
Mat Schaffer

4

यदि आप हरोकू का उपयोग करते हैं या अन्यथा आपको पर्यावरण चर के रूप में अपनी एप्लिकेशन सेटिंग्स को रखने की आवश्यकता है, तो अंजीर रत्न बहुत मददगार है।


2

मुझे वैश्विक कॉन्फ़िगरेशन मानों के लिए रेल-सेटिंग्स का उपयोग करना पसंद है जिन्हें वेब इंटरफ़ेस के माध्यम से परिवर्तनशील होना चाहिए।


2
मैं अतिरिक्त प्लगइन्स आदि का उपयोग नहीं करना चाहता, क्योंकि मैं रेल सीख रहा हूं, इसलिए ऐसा करने का सबसे अच्छा तरीका बिना किसी प्लगिन के होगा।
शिव

ध्यान दें कि कॉन्फ़िगरेशन का संग्रह करने के लिए डेटाबेस का उपयोग करता है, जो शायद कुछ लोगों के लिए बहुत भारी है।
लुललाला

0

कुछ हम जो काम करना शुरू कर रहे हैं वह है ActiveSupport ऑर्डर किया गया हैश

जो आपको पर्यावरण फ़ाइलों के अंदर अपने कॉन्फ़िगरेशन को साफ-साफ परिभाषित करने देता है

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

-5

मैं अच्छे दृष्टिकोण का सुझाव दूंगा कि आपके एप्लिकेशन में कॉन्फ़िगरेशन से कैसे निपटें। तीन बुनियादी नियम हैं:

  • अपना कॉन्फ़िगरेशन बदलें कोड नहीं;
  • शर्तों पर कॉन्फ़िगरेशन का उपयोग करें;
  • कोड लिखें जिसका अर्थ है कुछ।

अधिक विस्तृत अवलोकन करने के लिए इस लिंक का अनुसरण करें: उचित तरीके से कॉन्फ़िगरेशन कॉन्फ़िगर करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.