Railsでカスタム構成変数を定義する方法


337

カスタム構成変数をRailsアプリケーションに追加する方法とコントローラーでそれらにアクセスする方法を考えていました。たとえば、構成ファイルでupload_directoryを定義して、development.rbと定義し、自分のいずれかにアクセスできるようにしたいのですがコントローラ。

2番目に、アプリケーションでのアップロードのS3サポートを計画していたが、s3アクセス、秘密鍵を含むyamlファイルを追加したい場合は、Railsアプリでそれを初期化する方法と、定義した値にアクセスする方法その構成ファイルで。



少し関連:新しい設定変数を追加するときは、サーバーを再起動することを忘れないでください。
DamienÓCeallaigh

回答:


165

アップデート1

非常に推奨:私は今日、Rails Config gemを使用して、それが提供する細かい制御を行います。

Update2

簡単な解決策が必要な場合は、以下のJack Prattの回答を確認してください。

以下の私の元の答えはまだ機能しますが、この答えは古くなっています。アップデート1と2を確認することをお勧めします。

元の回答:

簡単な解決策として、Ryan Batesによってキャストされた「YAML構成ファイル」画面を見ることは非常に役立ちます。

要約すれば:

# 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:Rails 3がリリースされたため、または誰もがRails 3を使用しているため、それが古くなっていますか、それとも...?
Lasse V. Karlsen、

古いものを指摘していただきありがとうございます。Railsのことは嫌いです-1年前のコードは古すぎます。
jcollum 2011

2
Railsの3+でYAMLの方法を使用したい人のために、あなたは交換する必要がありますRAILS_ENVRails.envしてRAILS_ROOTRails.root
ライアン、

rails_configを試しました。ドキュメントでは、RailsConfigを私のapp.rbに登録するように指示されています。app.rb = config / application.rbと仮定します。しかし、application.rbのどこにレジスタRailsConfig行を配置すればよいですか?
NhímHO BAO

375

Rails 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

Rails 4の更新

Rails 4には、この新しい方法があります=> http://guides.rubyonrails.org/configuring.html#custom-configuration

ここに画像の説明を入力してください


11
わたしにはできる。環境固有の構成設定をenvironments / {environment} .rb(たとえば、environments / development.rb)に配置しました。変更後は必ずサーバーを再起動してください。より洗練された手法があるかもしれませんが、同じファイルで以前ENV ['XXX']を使用していた既存のアプリをアップグレードしています。アップグレード中にリファクタリングの量を制限したいので、これはうまくいきました。
pduey

13
これは割り当てですが、この値にどのようにアクセスしますか?
kevzettler 2011

9
Rails 3.xアプリのapplication.rbを見ると、この回答のとおり、「アプリケーション設定はconfig / initializersのファイルに入れる必要があります」と表示されます。変数にアクセスする方法に関するドキュメントはたくさんあります(edgeguides.rubyonrails.org/configuring.html)。たとえば、initializersフォルダーのsome_variables.rbというファイルに、上記のように変数を配置し(MyAppをアプリの名前に置き換えます)、それを使用する場合は、config.custom_config_variableを呼び出します。もちろん、好きな変数名を使用できます。 。@ジャックプラットあなたはより完全な答えを編集できますか?
jamesc 2011

48
おい、シンプル:パス: config/environments/production.rb 構成: config.whatever = false どこからでもアクセス: Rails.configuration.whatever
Victor S

5
何かを本番環境でのみ設定し、別の環境でアクセスしようとすると、文句を言うことに注意してくださいundefined method
lulalala

69

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

これをRails 4.1で試したところ、エラーが発生しました。「... method_missing': undefined method store 'for#<Rails :: Application :: Configuration:0x007f9f735b7240> ...」「config.store.works」構成変数を追加しようとしました。
Spundun 2014年

1
@Spundun Railsが何であるかを知らないので、あなたはそのエラーを得ていますstore。この回答でメソッドを使用するには、変数の名前を変更するか、変数を定義しstore_worksconfig.storeブロックを作成しますworks
Paul Pettengill、2014

おかげで、私は最終的にそれを理解しました。これらはネストされたハッシュであるため、構成名にドットを使用する場合は空のハッシュを再帰的に初期化する必要があります。
Spundun 2014

31

これはRails 3.1で機能します。

config / environment.rb(またはconfig / environments / ..にあり、特定の環境をターゲットにする):

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

これは、コントローラまたは次のようなビューでアクセスできます。

YourApp::Application.config.yourKey

(YourAppはアプリケーション名に置き換える必要があります。)

:これはRubyコードなので、多くの設定キーがある場合、これを行うことができます。

config / environment.rbで:

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

2
camelCase:o snake_caseを使用してください!
siegy22

30

Rails 4で

カスタム変数をyamlファイルに入れると仮定します。

# 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

Rails 4.2以降、gemを追加しなくても、を使用するだけでconfig / 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.gitignoreecho /config/passwords.yml >> .gitignore、あなたの快適のためのサンプルファイルを作成cp /config/passwords.yml /config/passwords.example.ymlしてからちょうど実際の生産値を持つ本番コンソールにあなたの例のファイルを編集します。



8

まさにそれをしているこのきちんとした宝石をチェックしてください:https//github.com/mislav/choices

これにより、機密データがオープンソースプロジェクトで公開されなくなります。


4

YAML設定用のシンプルなプラグインを作成しました: Yettings

これはkhelllの回答のコードと同様に機能しますが、次のYAML構成ファイルを追加するだけで済みます。

app/config/yetting.yml

プラグインは、次のようにアプリのクラスメソッドとしてYML設定にアクセスできるようにするクラスを動的に作成します。

Yetting.your_setting

また、一意の名前を持つ複数の設定ファイルを使用する場合は、次のようにそれらをapp / config内のサブディレクトリに配置できます。

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

Herokuを使用する場合、またはアプリケーション設定を環境変数として保持する必要がある場合は、figaro gemが非常に役立ちます。


2

Webインターフェースを介して変更可能にする必要があるグローバル構成値にrails-settingsを使用するのが好きです。


2
私はレールを学習しているので、追加のプラグインなどを使用したいので、プラグインなしで実行するのが最善の方法です。
Shiv

これはデータベースを使用して構成を格納することに注意してください。
lulalala 2013

0

仕事で始めたのはActiveSupport Ordered Hashです

これにより、環境ファイル内で構成をきれいに定義できます。

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

-5

アプリケーションの構成をどのように処理するかについて、良いアプローチを提案します。3つの基本的なルールがあります。

  • コードではなく設定を変更してください。
  • 条件を超えて構成を使用します。
  • 何かを意味するコードを書いてください。

より詳細な概要を得るには、次のリンクに従ってください:適切な方法でのRails構成

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.