Railsアプリのカスタム構成オプションを作成する最良の方法は?


133

Railsアプリケーションの構成オプションを1つ作成する必要があります。すべての環境で同じにすることができます。私がそれをに設定した場合environment.rb、それが私のビューで使用可能であることがわかりました。これはまさに私が欲しいものです...

environment.rb

AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda

よく働く。

しかし、私は少し不安です。これは良い方法ですか?よりヒップな方法はありますか?

回答:


191

データベーステーブルに保存する必要のない一般的なアプリケーション構成ではconfig.ymlconfigディレクトリ内にファイルを作成します。たとえば、次のようになります。

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

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults

この構成ファイルは、config / initializersのカスタム初期化子から読み込まれます

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

Rails 3を使用している場合は、相対構成パスに先頭のスラッシュを誤って追加しないようにしてください。

次に、以下を使用して値を取得できます。

uri_format = APP_CONFIG['audiocast_uri_format']

詳細については、このRailscastを参照してください。


1
あなたは、必要がある場合がありYAML::ENGINE.yamler = 'syck'、作業には、このためにstackoverflow.com/a/6140900/414220
evanrmurphy

45
参考までに、Rails 3.xではRAILS_ENVRails.envおよびRAILS_ROOTで置き換える必要がありますRails.root
JeanMertz

5
Rails 3以降の場合は、絶対パスではなく相対パスを結合する必要があります。configディレクトリの前にスラッシュを付けないでください。
wst

10
以前のバージョンについては不明ですが、Rails 4.1で実行できますRails.application.config.whatever_you_want = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env]
d4rky

2
@ iphone007設定ディレクトリから任意のyamlファイルをロードすることは確かに可能です。以下のスマシーの答えを見てください。私の意見では、これが今では受け入れられる答えになるはずです。
omn​​ikron

82

Rails 3バージョンの初期化コードは次のとおりです(RAILS_ROOTおよびRAILS_ENVは非推奨です)

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

また、Ruby 1.9.3はPsychを使用しているため、マージキーで大文字と小文字が区別されるため、設定ファイルを変更して、それを考慮に入れる必要があります。

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

development:
  <<: *DEFAULTS

test:
  <<: *DEFAULTS

production:
  <<: *DEFAULTS

3
あなたは必要ありません"#{Rails.root.to_s}""#{Rails.root}"動作します。
David J.

3
Rails.root.join('config', 'config.yml')代わりに私がお勧めします"#{Rails.root.to_s}/config/config.yml"
David J.

2
そして、代わりにAPP_CONFIG、私は使用をお勧めします:AppName::Application.config.custom
デヴィッド・J.

1
David、最初の2つのコメントはベストプラクティスであり、コードを修正しますが、最後のコメントは除外します。これは、このコードを使用するたびにAppNameを変更することを忘れないようにする必要があることを意味します。
David Burrows、

53

Rails> = 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

より詳しい情報

Rails公式APIドキュメントはconfig_forメソッドを次のように説明しています:

現在のRails envのconfig / foo.ymlをロードするのに便利です。


yamlファイルを使用したくない場合

Rails公式ガイドによると:

config.xプロパティの下のカスタム構成を使用して、Rails構成オブジェクトを介して独自のコードを構成できます。

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メソッドの公式リファレンス | 公式Railsガイド


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に変数を追加し、キーを使用してconfig.ymlで変数を読み取ろうとしています:<%= ENV [URL]%> ... this動作していません
シヴァ

@shiva ENV変数については、Figaro gemを調べてください。この構成設定は、ソース管理から非表示にする必要がない値用です。
Shadoath 2017年

17

これをRails 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 2015

素晴らしい点@tobinibot-私はその説明を私の回答に追加しました、ありがとう。
smathy 2015

ガイドが実際に「x」について言及していないことは興味深いが、Rails 5.0の時点ではまだ必要であることを証明できる
Don

あなたは正しいドンです、それは奇妙です-私はそれがそれを言っていたと確信しています。
smathy

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

John for Rails 3.0 / 3.1に似たものを使用しますが、最初にerbでファイルを解析します。

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

これにより、herokuのredistogo URLを読むなど、必要に応じて構成でERBを使用できます。

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

2
私はこれが毎日必要になるとは思いませんが、必要なときのための本当にクールなソリューションです。Railsの規則に合わせるために、ファイル名をconfig.yml.erbに変更すると思います。
アンドリュー・バーンズ

2

Rails 4

カスタム構成yamlを作成してロードする(そしてアプリで利用できるようにする)方法はと同じdatabase_configurationです。

を作成します*.yml。私の場合、redis構成ファイルが必要でした。

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以降では、smathyの答えがおそらく最も簡単な方法です。
omn​​ikron

1

Omer Aslamのエレガントなソリューションに基づいて、キーをシンボルに変換することにしました。唯一の変更は次のとおりです。

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

これにより、シンボルとしてキーとして値を参照できます。例:

AppConfig[:twitter][:key]

これは私の目にすっきりしているようです。

(私の評判はオメルの返信にコメントするのに十分高くないので、回答として投稿されました)



0

アプリケーションパラメータを保存するのに最適な場所はどこですか?への私の応答を参照してください:データベース、ファイル、コード...?

別のファイルへの単純な参照であるという点でのバリエーション。これは、environment.rbが絶えず更新されておらず、アプリ固有のもののヒープがないことを示しています。「それはRailsの方法ですか?」というあなたの質問に対する具体的な回答ではありませんが、おそらくそれについていくつかの議論があるでしょう。


0

グローバルアプリケーションスタックから設定にアクセスすることを好みます。ローカルスコープで過剰なグローバル変数を回避します。

config / initializers / myconfig.rb

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

そしてそれにアクセスします。

MyAppName::Application.myconfig["yamlstuff"]

0

Railsが初期化する前に設定をロードする私の方法

Railsの初期化で設定を使用し、環境ごとに設定を構成できます

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

次の2つの方法で設定を取得できます 。Settings['email']またはSettings.email


0

カスタム設定への私の最善の方法は、setting.ymlがない場合にメッセージを発生させることです。

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]

YAMLをconfig / setting.ymlに作成します

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.