मेरे रेल एप्लिकेशन के लिए कस्टम कॉन्फ़िगरेशन विकल्प बनाने का सबसे अच्छा तरीका है?


133

मुझे अपने रेल अनुप्रयोग के लिए एक विन्यास विकल्प बनाने की आवश्यकता है। यह सभी वातावरणों के लिए समान हो सकता है। मैंने पाया कि अगर मैं इसे सेट करता हूं environment.rb, तो यह मेरे विचारों में उपलब्ध है, जो कि वास्तव में मैं चाहता हूं ...

environment.rb

AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda

बहुत अच्छा काम करता है।

हालांकि, मैं थोड़ा असहज हूं। क्या यह एक अच्छा तरीका है? वहाँ एक तरीका है कि अधिक कूल्हे है?

जवाबों:


191

सामान्य एप्लिकेशन कॉन्फ़िगरेशन के लिए जिसे डेटाबेस तालिका में संग्रहीत करने की आवश्यकता नहीं है, मुझे कॉन्फ़िगरेशन निर्देशिका के config.ymlभीतर एक फ़ाइल बनाना पसंद है । आपके उदाहरण के लिए, यह इस तरह दिख सकता है:

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

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults

यह कॉन्फ़िगरेशन फ़ाइल कस्टम इनिशियलाइज़र से कॉन्फ़िगर / इनिशियलाइज़र में लोड हो जाती है :

# 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]

यदि आप रेल 3 का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप गलती से अपने रिश्तेदार के कॉन्फ़िगर पथ में एक प्रमुख स्लैश न जोड़ें।

तब आप मान का उपयोग करके प्राप्त कर सकते हैं:

uri_format = APP_CONFIG['audiocast_uri_format']

देखें इस Railscast पूर्ण विवरण के लिए।


1
इसके लिए आपको stackoverflow.com/a/6140900/414220YAML::ENGINE.yamler = 'syck'
evanrmurphy

45
बस एक FYI करें, रेल में आप को बदलने के लिए की जरूरत है 3.x RAILS_ENVके साथ Rails.envऔर RAILS_ROOTसाथ Rails.root
जीनमर्ट्ज़

5
रेल 3+ के लिए आपको सापेक्ष पथ से जुड़ना चाहिए, निरपेक्ष नहीं। स्लैश के साथ कॉन्फ़िगर निर्देशिका उपसर्ग न करें।
wst

10
पिछले संस्करणों के बारे में निश्चित नहीं है, लेकिन रेल 4.1 में आप कर सकते हैंRails.application.config.whatever_you_want = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env]
d4rky

2
@ iphone007 विन्यास निर्देशिका से मनमाना yaml फ़ाइलों को लोड करना संभव है। नीचे स्माइली का उत्तर देखें जो मेरी राय में अब स्वीकृत उत्तर होना चाहिए।
ओमनिकॉन

82

आरंभिक कोड के 3 संस्करण निम्नानुसार हैं (RAILS_ROOT & RAILS_ENV को पदावनत कर दिया गया है)

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

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

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

development:
  <<: *DEFAULTS

test:
  <<: *DEFAULTS

production:
  <<: *DEFAULTS

3
आप की जरूरत नहीं है "#{Rails.root.to_s}"; "#{Rails.root}"काम करता है।
डेविड जे।

3
मैं Rails.root.join('config', 'config.yml')इसके बजाय सलाह देता हूं"#{Rails.root.to_s}/config/config.yml"
डेविड जे।

2
और, APP_CONFIG के बजाय, मैं उपयोग करने की सलाह देता हूं:AppName::Application.config.custom
डेविड जे।

1
डेविड, आपकी पहली दो टिप्पणियाँ सबसे अच्छी प्रैक्टिस हैं और मैं कोड को अमेंड कर दूंगा लेकिन पिछले एक मैं इसे छोड़ने जा रहा हूं क्योंकि इसका मतलब है कि जब भी आप इस कोड का उपयोग करते हैं, तो आपको AppName को बदलने के लिए याद रखना होगा।
डेविड

53

रेलें> = 4.2

उदाहरण के लिए, निर्देशिका YAMLमें एक फ़ाइल बनाएं :।config/config/neo4j.yml

की सामग्री neo4j.ymlनीचे (सादगी के लिए, मैं सभी के वातावरण के लिए डिफ़ॉल्ट प्रयोग किया जाता) की तरह somthing जा सकता है:

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

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default

में config/application.rb:

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

अब, आपका कस्टम विन्यास नीचे की तरह सुलभ है:

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

और जानकारी

रेल आधिकारिक एपीआई दस्तावेज config_forविधि का वर्णन करता है:

वर्तमान रेल के लिए विन्यास / foo.yml लोड करने की सुविधा।


अगर आप किसी yamlफाइल का इस्तेमाल नहीं करना चाहते हैं

जैसा कि रेल अधिकारी गाइड कहते हैं:

आप config.xसंपत्ति के तहत कस्टम कॉन्फ़िगरेशन के साथ रेल कॉन्फ़िगरेशन ऑब्जेक्ट के माध्यम से अपना कोड कॉन्फ़िगर कर सकते हैं।

उदाहरण

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

ये कॉन्फ़िगरेशन बिंदु तब कॉन्फ़िगरेशन ऑब्जेक्ट के माध्यम से उपलब्ध हैं:

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_forविधि के लिए आधिकारिक संदर्भ | आधिकारिक रेल गाइड


25

चरण 1: config / initializers / appconfig.rb बनाएँ

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: config / config.yml बनाएँ

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

development:
  <<: *common

test:
  <<: *common

production:
  <<: *common

चरण 3: कोड में कहीं भी स्थिरांक प्राप्त करें

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

हम config.yml में ENV वैरिएबल कैसे पढ़ते हैं, मेरा कॉन्फिगरेशन वैसा ही है .. मैंने bashrc में वेरिएबल को जोड़ा है और im को पढ़ने की कोशिश कर रहा हूँ कि config.yml में कुंजी का उपयोग कर: <% = ENV [URL]%> ... यह काम नहीं कर रहा है
शिवा

@ शिव ईएनवी चर के लिए फिगारो मणि में देखें। यह कॉन्फ़िगरेशन सेटअप उन मानों के लिए है जिन्हें स्रोत नियंत्रण से छिपाए जाने की आवश्यकता नहीं है।
शादौथ

17

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

config.x.whatever = 42

(और कहा कि xवहाँ एक शाब्दिक है, यानी config.x.शाब्दिक रूप से ऐसा होना चाहिए, और फिर आप जो चाहें जोड़ सकते हैं x)

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

Rails.configuration.x.whatever

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


3
बस एक स्पष्टीकरण जो शुरू में मेरे लिए एक समस्या का कारण बना; x जो कुछ भी आप में डालना चाहते हैं, उसके लिए प्लेसहोल्डर नहीं है, यह वास्तव में अक्षर होना चाहिए x
tobinibot

ग्रेट पॉइंट @tobinibot - मैंने उस स्पष्टीकरण को अपने उत्तर में जोड़ दिया है, धन्यवाद।
स्मार्ती

दिलचस्प है कि गाइड वास्तव में 'x' का उल्लेख नहीं करते हैं, लेकिन मैं यह देख सकता हूं कि यह रेल्स 5.0 के रूप में अभी भी आवश्यक है
डॉन

आप सही हैं डॉन, यह अजीब है - मुझे यकीन है कि यह कहने के लिए इस्तेमाल किया गया था।
स्माइली

1
वर्तमान रेल डॉक्स से: 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).स्रोत: guide.rubyonrails.org/configuring.html#custom-configuration
David Gay

6

इस विषय पर कुछ अतिरिक्त जानकारी:

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

".with_indifferent_access" आपको स्ट्रिंग कुंजी का उपयोग करके या समकक्ष प्रतीक कुंजी के साथ हैश में मूल्यों का उपयोग करने की अनुमति देता है।

जैसे।
APP_CONFIG['audiocast_uri_format'] => 'http://blablalba/blabbitybla/yadda' APP_CONFIG[:audiocast_uri_format] => 'http://blablalba/blabbitybla/yadda'

विशुद्ध रूप से एक सुविधा की बात है, लेकिन मैं अपनी कुंजी को प्रतीकों के रूप में प्रस्तुत करना पसंद करता हूं।


5

मैं रेल 3.0 / 3.1 के लिए जॉन के समान कुछ का उपयोग करता हूं, लेकिन मैंने फ़ाइल को पहले पार्स किया है:

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

यह मुझे अपने विन्यास में ईआरबी का उपयोग करने की अनुमति देता है, अगर मुझे ज़रूरत है, तो हेरोकू के रीडिस्टोगो यूआरएल पढ़ने की तरह:

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

2
मुझे नहीं लगता कि मुझे हर दिन इसकी आवश्यकता होगी, लेकिन यह उन समय के लिए वास्तव में अच्छा समाधान है जब आपको इसकी आवश्यकता होती है। मुझे लगता है कि मैं रेल कन्वेंशन से मिलान करने के लिए फ़ाइल नाम को config.yml.erb में बदल दूंगा।
एंड्रयू बर्न्स

2

Rails 4

कस्टम कॉन्फ़िगरेशन यम बनाने के लिए और इसे लोड करें (और अपने ऐप को उपलब्ध कराएं) कैसे database_configuration

*.ymlअपनी स्थिति बनाएं , मेरे मामले में मुझे एक रेडिस कॉन्फ़िगरेशन फ़ाइल की आवश्यकता थी।

config/redis.yml

default: &default
  host: localhost
  port: 6379

development:
  <<: *default

test:
  <<: *default

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

फिर कॉन्फ़िगरेशन लोड करें

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

मूल्यों तक पहुँचें:

Rails.configuration.redis_configuration[Rails.env]इसी तरह आप अपने database.ymlद्वारा एक्सेस कर सकते हैंRails.configuration.database_configuration[Rails.env]


आप अपने वर्तमान परिवेश के लिए केवल सेटिंग्स लेने से भी खुद को कुछ समय के लिए बचा सकते हैं, जो संभवतः केवल वही हैं जो आपको वैसे भी चाहिए Rails.configuration.redis_configuration = YAML.load_file("#{Rails.root}/config/redis.yml")[Rails.env]:। हालाँकि, रेल के 4.2 और ऊपर के स्मैथी के उत्तर शायद जाने का एक सरल तरीका है।
ओमनिकॉन

1

ओमर असलम के सुरुचिपूर्ण समाधान पर निर्माण, मैंने चाबियों को प्रतीकों में बदलने का फैसला किया। केवल परिवर्तन है:

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

यह आपको कुंजी के रूप में प्रतीकों द्वारा मानों को संदर्भित करने की अनुमति देता है, जैसे

AppConfig[:twitter][:key]

यह मेरी आँखों को लगता है।

(एक जवाब के रूप में मेरी प्रतिष्ठा ओमर के जवाब पर टिप्पणी करने के लिए पर्याप्त नहीं है)



0

करने के लिए मेरी प्रतिक्रिया देखना कहाँ दुकान आवेदन मापदंडों के लिए सबसे अच्छी जगह है: डेटाबेस, फ़ाइल, कोड ...?

आपके पास जो कुछ था उसमें भिन्नता यह एक अन्य फ़ाइल का एक साधारण संदर्भ है। यह देखता है कि environment.rb लगातार अपडेट नहीं होता है और इसमें ऐप विशिष्ट सामग्री का ढेर नहीं है। यद्यपि 'क्या यह रेल रास्ता है?' के आपके प्रश्न का कोई विशिष्ट उत्तर नहीं है, शायद इस बारे में वहां कुछ चर्चा होगी।


0

मैं वैश्विक एप्लिकेशन स्टैक के माध्यम से सेटिंग एक्सेस करना पसंद करता हूं। मैं स्थानीय दायरे में अधिक वैश्विक चर से बचता हूं।

config / initializers / myconfig.rb

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

और इसके साथ एक्सेस करें।

MyAppName::Application.myconfig["yamlstuff"]

0

रेल शुरू होने से पहले सेटिंग्स को लोड करने का मेरा तरीका

आपको रेल्स आरंभीकरण में सेटिंग्स का उपयोग करने और प्रति वातावरण सेटिंग्स को कॉन्फ़िगर करने की अनुमति देता है

# 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)}

आप दो तरीकों से सेटिंग्स प्राप्त कर सकते हैं: सेटिंग्स ['ईमेल'] या सेटिंग्स.मेल


0

कस्टम कॉन्फ़िगर करने के लिए मेरा सबसे अच्छा तरीका है, जब स्थापना के साथ संदेश। सेटिंग गायब है।

config / initializers / custom_config.rb में एक कस्टम इनिशियलाइज़र से लोड हो जाता है

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 में एक YAML बनाएँ

development:
  app_id: 433387212345678
  app_secret: f43df96fc4f65904083b679412345678

test:
  app_id: 148166412121212
  app_secret: 7409bda8139554d11173a32222121212

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