Railsアプリケーションにカスタム設定変数を追加する方法とコントローラでそれらにアクセスする方法を考えていました。例えば、development.rbと言う設定ファイルでupload_directoryを定義し、自分のいずれかでそれにアクセスできるようにしたいのです。コントローラ。
S3アクセス、秘密鍵を使ってyamlファイルを追加したいのなら、Railsアプリでそれをどのように初期化すればいいのか、そして自分が定義した値にどのようにアクセスすればいいのか。その設定ファイルで。
アップデート1
非常にお勧め:私は Rails Config gemを使って、きめ細かい制御を提供しています。
Update2
迅速な解決策が必要な場合は、 Jack Pratt's answer をチェックしてください。
以下の私の最初の答えはまだうまくいきますが、この答えは古くなっています。アップデート1と2を見ることをお勧めします
元の答え:
手っ取り早い解決策としては、Ryan Batesによる "YAML Configuration File" screen cast を見ることは非常に役に立つはずです。
要約すれば:
# 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
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
UPDATE Rails 4
Rails 4ではこれに対する新しい方法があります=> http://guides.rubyonrails.org/configuring.html#custom-configuration
Rails 3.0.5では、次のアプローチが私のために働きました:
config/environments/development.rb
に、書く
config.custom_config_key = :config_value
値custom_config_key
は他のファイルから参照することができます。
Rails.application.config.custom_config_key
これはRails 3.1で動作します。
config/environment.rb(または特定の環境を対象とする場合はconfig/environment/..):
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
あなたのカスタム変数を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
をロードして正しい環境を使うことは便利です。
追加の宝石なしで、Rails 4.2以降あなたは単にRails.application.config_for :hi
を使うことによってconfig/hi.ymlをロードすることができます。
例:
touch config/passwords.yml
#config/passwords.yml
development:
username: 'a'
password: 'b'
production:
username: 'aa'
password: 'bb'
touch config/initializers/constants.rb
#config/initializers/constants.rb
AUTHENTICATION = Rails.application.config_for :passwords
これで、アプリケーション内のあらゆる場所でAUTHENTICATION
定数を使用できます。
#Rails c production
:001> AUTHENTICATION['username'] => 'aa'
次にpasswords.ymlをに追加します。gitignore:echo /config/passwords.yml >> .gitignore
、例を作成してくださいあなたの快適さのためのファイルcp /config/passwords.yml /config/passwords.example.yml
そしてそれから実際の生産価値であなたの生産コンソールのあなたの例のファイルを編集してください。
Rails 4.2の最新のクールなもの用にこれを更新したいだけです。これで任意のconfig/**/*.rb
ファイル内でこれを実行できます。
config.x.whatever.you.want = 42
...これはあなたのアプリで以下のように利用可能になります。
Rails.configuration.x.whatever.you.want
詳細はこちら: http://guides.rubyonrails.org/configuring.html#custom-configuration
まさにそれをやっているこのきちんとした宝石をチェックしてください: https://github.com/mislav/choices
これにより、機密データがオープンソースプロジェクトに公開されることはありません。
私は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を使用することもできます。
私は settingslogic gemがとても好きです。セットアップと使用が非常に簡単です。
Herokuを使用している場合、またはアプリケーションの設定を環境変数として保持する必要がある場合は、 figaro gemが非常に役立ちます。
Webインターフェースで変更可能にする必要があるグローバル設定値には Rails-settings を使うのが好きです。
私たちが仕事でやろうとしているのは ActiveSupport Ordered Hash です。
これにより、環境ファイル内で設定を明確に定義することができます。
config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']