আমার রেলস অ্যাপ্লিকেশনটির জন্য কাস্টম কনফিগারেশন বিকল্পগুলি তৈরি করার সর্বোত্তম উপায়?


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

সম্পূর্ণ বিবরণের জন্য এই রেইলকাস্টটি দেখুন ।


1
আপনার প্রয়োজন হতে পারে YAML::ENGINE.yamler = 'syck'এটির জন্য কাজ করতে stackoverflow.com/a/6140900/414220
evanrmurphy

45
কেবলমাত্র একটি FYI, রেল 3.x এ আপনাকে RAILS_ENVসাথে Rails.envএবং এর RAILS_ROOTসাথে প্রতিস্থাপন করতে হবে Rails.root
জিনমার্টজ

5
রেল 3+ এর জন্য আপনার আপেক্ষিক পথে যোগ দেওয়া উচিত, পরম নয়। স্ল্যাশ সহ কনফিগারেশন ডিরেক্টরি উপসর্গ করবেন না।
wst

10
পূর্ববর্তী সংস্করণগুলি সম্পর্কে নিশ্চিত নন তবে Rails.application.config.whatever_you_want = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env]
ails.১ রেলগুলিতে

2
@ আইফোন007 কনফিগার ডিরেক্টরি থেকে নির্বিচারে ইয়ামল ফাইল লোড করা সত্যিই সম্ভব। দেখতে smathy এর উত্তর যার নীচে আমার মতে এখন গৃহীত উত্তর হওয়া উচিত।
omnikron

82

প্রারম্ভিক কোডের রেলগুলি 3 সংস্করণটি নিম্নরূপ রয়েছে (RAILS_ROOT এবং RAILS_ENV হ্রাস করা হয়নি)

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

এছাড়াও, রুবি ১.৯.৩ সাইক ব্যবহার করে যা মার্জ কীগুলি কেসকে সংবেদনশীল করে তোলে তাই আপনার অ্যাকাউন্টটি নিতে আপনার কনফিগারেশন ফাইলটি পরিবর্তন করতে হবে, যেমন

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
ডেভিড, আপনার প্রথম দুটি মন্তব্য সর্বোত্তম অনুশীলন এবং আমি কোডটি প্রশংসিত করব তবে শেষটি আমি ছেড়ে যাচ্ছি যার অর্থ এই কোডটি প্রতিবার ব্যবহার করার সময় আপনার অ্যাপনামটি পরিবর্তন করা উচিত।
ডেভিড বুরোজ

53

রেল> = 4.2

উদাহরণস্বরূপ: কেবল ডিরেক্টরিতে একটি YAMLফাইল তৈরি করুন ।config/config/neo4j.yml

বিষয়বস্তু neo4j.ymlনীচের মতো কিছু হতে পারে (সরলতার জন্য, আমি সমস্ত পরিবেশের জন্য ডিফল্ট ব্যবহার করেছি):

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: কনফিগার / আরম্ভকারী / 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.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']

আমরা কনফিগার.আইএমএল এএনভি ভেরিয়েবলটি কীভাবে পড়ব, আমার কনফিগারেশনটি একই .. আমি বাশার্কে ভেরিয়েবল যুক্ত করেছি এবং কনফিগারেশনে কীটি ব্যবহার করার চেষ্টা করছি: <% = ENV [URL]%> ... এটি কাজ করছে না
শিব

@ শিভা ENV ভেরিয়েবলের জন্য ফিগারো রত্নটি দেখুন। এই কনফিগার সেটআপটি এমন মানগুলির জন্য যা উত্স নিয়ন্ত্রণ থেকে গোপন করা দরকার হয় না।
শাডাথ

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-configration


3
কেবলমাত্র একটি ব্যাখ্যা যা প্রাথমিকভাবে আমার জন্য সমস্যা তৈরি করেছিল; এক্স আপনি যা কিছু রাখতে চান তার জন্য স্থানধারক নয়, এটি সত্যই চিঠি হওয়া দরকার x
tobinibot

দুর্দান্ত পয়েন্ট @ টোবিনিবোট - আমি এই উত্তরটি আমার উত্তরটিতে যুক্ত করেছি, ধন্যবাদ।
স্মিথ

আকর্ষণীয় যে গাইডগুলি আসলে 'এক্স' উল্লেখ করে না, তবে আমি নিশ্চিত করতে পারি যে এটি এখনও জেল 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).উত্স: guides.rubyonrails.org/configuring.html# কাস্টম- কনফিগারেশন
ডেভিড গে

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]

এটি আমার দরকার হলে আমার কনফিগারেশনে ইআরবি ব্যবহার করতে অনুমতি দেয়, যেমন হিরকু'র পুনর্নির্মাণ url পড়ার মতো:

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

2
আমি প্রতিদিন এটির প্রয়োজন হবে বলে মনে করি না, তবে আপনার যখন প্রয়োজন হবে তখন this সময়ের এটি একটি দুর্দান্ত সমাধান। আমি মনে করি রেল কনভেনশনের সাথে মেলে যদিও আমি ফাইলের নামটি কনফিগার করে।
অ্যান্ড্রু বার্নস

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]। তবে রেলের মধ্যে ৪.২ এবং এর চেয়ে বেশি স্মার্টের উত্তর সম্ভবত খুব সহজ উপায় way
ওমনিক্রন

1

ওমর আসলামের মার্জিত সমাধানের ভিত্তিতে, আমি কীগুলি প্রতীকগুলিতে রূপান্তর করার সিদ্ধান্ত নিয়েছি। একমাত্র পরিবর্তনটি হ'ল:

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

এটি আপনাকে প্রতীক দ্বারা কী হিসাবে উদ্বোধন করে, উদাহরণস্বরূপ

AppConfig[:twitter][:key]

এটি আমার চোখে আরও পরিষ্কার দেখা যায়।

(আমার খ্যাতি ওমরের জবাব সম্পর্কে মন্তব্য করার মতো যথেষ্ট নয় বলে একটি উত্তর হিসাবে পোস্ট করা হয়েছে)



0

আমার প্রতিক্রিয়া দেখুন অ্যাপ্লিকেশন প্যারামিটারগুলি সঞ্চয় করার জন্য সেরা জায়গাটি কোথায়: ডাটাবেস, ফাইল, কোড ...?

আপনার যা ছিল তার মধ্যে একটি প্রকরণ এটি অন্য কোনও ফাইলের একটি সাধারণ রেফারেন্স। এটি দেখেছে যে পরিবেশ.rb ক্রমাগত আপডেট হয় না এবং এতে অ্যাপ্লিকেশন নির্দিষ্ট স্টাফগুলির একটি গাদা থাকে না। যদিও এটি 'রেলের উপায়?' সম্পর্কে আপনার প্রশ্নের সুনির্দিষ্ট উত্তর না হলেও, সম্ভবত সে সম্পর্কে সেখানে কিছু আলোচনা হবে।


0

আমি বিশ্বব্যাপী অ্যাপ্লিকেশন স্ট্যাকের মাধ্যমে সেটিংস অ্যাক্সেস করতে পছন্দ করি। আমি স্থানীয় সুযোগে অতিরিক্ত গ্লোবাল ভেরিয়েবল এড়িয়ে চলি।

কনফিগ / 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)}

আপনি দুটি উপায়ে সেটিংস পেতে পারেন: সেটিংস ['ইমেল'] বা Settings.email


0

সেটিংস.আইএমএল অনুপস্থিত থাকাকালীন বার্তাগুলি সহ কাস্টম কনফিগার করার সেরা উপায়।

কনফিগারেশন / আরম্ভকারী / কাস্টম_কনফিগ.আরবিতে একটি কাস্টম ইনিশিয়ালাইজার থেকে লোড হয়

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]

কনফিগারেশন / সেটিং.আইএমএলে একটি ওয়াইএএমএল তৈরি করুন

development:
  app_id: 433387212345678
  app_secret: f43df96fc4f65904083b679412345678

test:
  app_id: 148166412121212
  app_secret: 7409bda8139554d11173a32222121212

production:
  app_id: 148166412121212
  app_secret: 7409bda8139554d11173a32222121212
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.