2010-11-10 10 views
24

मैं अपने एप्लिकेशन.आरबी में दो अतिरिक्त कॉन्फ़िगरेशन विकल्प जोड़ने की कोशिश कर रहा हूं ताकि मैं उन्हें नियंत्रकों में पढ़ सकूं।नियंत्रक में अनुप्रयोग.आरबी से कॉन्फ़िगरेशन एक्सेस करना (रेल 3)

self.config.twitter.key # Should be extended through ApplicationController Base 
config.twitter.key # Inherited but with different syntax 
CONFIG['twitter']['key'] #some massive magical array that apparently exists somewhere 

वे सब मुझे दे त्रुटि के विभिन्न प्रकार जब मैं उन्हें "डिबग" विधि के माध्यम से पारित, उदाहरण के लिए::

# Extra 
config.twitter.key = 'foo' 
config.twitter.secret = 'bar' 

मैं तीन सुझाव दिया तरीकों का उपयोग कर उन तक पहुंचने की कोशिश कर रहा हूँ

debug self.config.twitter.key # undefined method `key' for nil:NilClass 

तो, क्या चल रहा है?

उत्तर

45

मेरा मानना ​​है कि आपको कॉन्फ़िगर/application.rb के लिए आपकी अपेक्षाओं के पीछे क्या थोड़ा सा गलत विचार है। ActiveRecord :: बेस और ActiveController :: बेस eigenclasses रेल :: अनुप्रयोग :: कॉन्फ़िगरेशन क्लास का उपयोग करें जो config/application.rb में कॉन्फ़िगर किया गया है। गुण कक्षाओं में उपलब्ध नहीं हैं जो बेस कक्षाओं में से किसी एक से निकलते हैं, न ही उनके eigenclasses। यही कारण है कि आप ApplicationController में त्रुटियों में चल रहे हैं।

रेल ऐप में कॉन्फ़िगरेशन प्रारंभ करने के लिए आम तौर पर दो तरीके हैं। पहला तरीका प्रारंभकर्ता के माध्यम से इसे में एक विन्यास मॉड्यूल और फिर भार मूल्यों बनाने के लिए है:

सबसे पहले, एक Twiter कॉन्फ़िग मॉड्यूल बनाने के लिए:

# config/twitter.yaml 
development: &base 
    key: "foo" 
    secret: "bar" 

test: 
<<: *base 
key: "foo2" 

production: 
    <<: *base 
    secret: "barbar" 

:

#lib/twitter_config.rb 
module TwitterConfig 
    def self.config 
    @@config ||= {} 
    end 

    def self.config=(hash) 
    @@config = hash 
    end 
end 

एक YAML कॉन्फ़िग फ़ाइल बनाएं वैकल्पिक रूप से, यदि आप अपने एससीएम में config/twitter.yaml जोड़ने का इरादा नहीं रखते हैं, तो आप इसे छोड़ सकते हैं और पर्यावरण चर के माध्यम से कुंजी और गुप्त सेट कर सकते हैं। हेरोोकू पर तैनात सार्वजनिक एससीएम भंडार के साथ एक आवेदन के लिए यह सुझाया गया समाधान होगा।

फिर से लोड और एक प्रारंभकर्ता के माध्यम से मान सेट:

#config/initializers/01_twitter.rb 
require 'twitter_config' 

TwitterConfig.config = YAML.load_file("config/config.yml")[Rails.env].symbolize_keys 

यह आम तौर पर के रूप में रेल उनके फ़ाइल नाम के अनुसार क्रम में उन्हें लोड होगा अपने प्रारंभकर्ता फ़ाइलों नंबर एक अच्छी आदत है। यदि आप डेटास्टोर शुरू कर रहे हैं और यह अन्य चरणों के लिए महत्वपूर्ण है, तो इसे सबसे कम संख्या की आवश्यकता है। वैकल्पिक रूप से, अगर आप वातावरण चर का उपयोग कर रहे, इस init फ़ाइल होगा:

#config/initializers/01_twitter.rb 
require 'twitter_config' 

TwitterConfig.config[:key] = ENV['twitter_config_key'] 
TwitterConfig.config[:secret] = ENV['twitter_config_secret'] 

रेल आवेदन के दौरान, अब आप TwitterConfig.config साथ config मूल्यों के लिए उपयोग किया [: कुंजी] & TwitterConfig.config [: गुप्त]। आप मॉड्यूल भी शामिल कर सकते हैं, केवल विवादों के लिए देखें।

आप मूल्यों को वैश्विक स्थिरता के रूप में भी लोड कर सकते हैं। यह मेरे लिए एक सा बदसूरत महसूस करता है, हालांकि:

#config/application.rb 
TWITTER_CONFIG = YAML.load_file("config/twitter.yaml")[Rails.env] 
+2

खूनी अच्छा जवाब, बहुत बहुत धन्यवाद। –

+0

यह विकास सर्वर में शून्य करने के लिए चर को रीसेट करें! –

+0

मुझे रूबी 1.9.2-पी 180 के साथ रेल 3.1 ऐप पर काम करने में कुछ परेशानी हो रही है। मेरे आवेदन में, अगर मैं TwitterConfig.method को कॉल करना चाहता था, तो यह मुझे बस एक त्रुटि देगा। हालांकि, अगर मैं TwitterConfig.instance_methods का निरीक्षण करता हूं, तो मैं स्पष्ट रूप से परिभाषित विधियों को देख सकता हूं। – Emerson

5

आप यामल फ़ाइल दृष्टिकोण का उपयोग करने पर विचार करना चाहेंगे।

application.rb

CONFIG = YAML.load_file("config/config.yml")[Rails.env] 

में

config में/config.yml

development: &base_config 
    twitter_key = "foo" 
    twitter_secret = "bar" 

test: 
    <<: *base_config 
    twitter_key = "foo2" 

production: 
    <<: *base_config 
    twitter_secret = "barbar" 

ही अधिक भार के साथ एक वातावरण स्तर पर definable विशेषताओं के साथ के रूप में पहले उपयोग।

CONFIG['twitter_key'] 
+0

कि बहुत अच्छा लगता है, लेकिन कैसे क्या मैं उन मानों को application.rb में पढ़ सकता हूं। क्या वह नहीं है कि वे क्या हैं? –

-1

बस app_config.rb तरह config/initializers/ में एक फ़ाइल डाल आप ENV लगातार आप बाद में आसानी से heroku config:add twitter_key=mypublickey कमांड के साथ मान सेट Heroku को तैनात कर सकते हैं का उपयोग करते हैं।

कुछ इस तरह:

## config/initializers/app_config.rb 
unless Rails.env.production? 
    ENV['twitter_key'] = 'foo' 
    ENV['twitter_secret'] = 'bar' 
end 

आप संशोधन नियंत्रण से बाहर अपने उत्पादन कुंजी रखने के लिए और YAML-फाइलों के साथ सोता की जरूरत नहीं है।

0

व्यापक रूप से स्वीकार जवाब यहाँ करने के लिए एक छोटा सा अद्यतन: Accessing config from application.rb in Controller (Rails 3)

मॉड्यूल (यदि आप इसे इस तरह से पसंद करते हैं या मॉड्यूल तरीकों) TwitterConfig वर्ग तरीकों होना चाहिए अंदर तरीकों। वे उदाहरण विधियां नहीं हो सकती हैं।

इसे उत्तर में रखने के लिए खेद है, लेकिन मुझे उस उत्तर पर टिप्पणी करने का कोई तरीका नहीं मिला।

13

मैंने कोशिश की है और काम कर रहा है, आप :: Rails.application.config का उपयोग कर सकते हैं।

उदाहरण के लिए मैं इसे उपयोग कर रहा हूँ सही TIME_ZONE इस तरह आवेदन में सेट प्राप्त करने के लिए:

Rails.application.config.time_zone

मैं इसे less- करने के लिए धन्यवाद पाया रेल कोड: https://github.com/metaskills/less-rails/blob/master/lib/less/rails/helpers.rb

तो आप इस अपने application.rb में या किसी वातावरण फ़ाइल में घोषणा कर सकते हैं:

config.twitter_key = 'foo'

और फिर तो कहीं भी अपने कोड में है जैसे कि यह पढ़ें:

Rails.application.config.twitter_key

+0

दो कॉलन ('::') की आवश्यकता नहीं प्रतीत होती है। –

संबंधित मुद्दे