- 更新日: 2014年3月10日
- Rails
Rails でアプリ固有の設定情報や定数を定義する
gem を使わずに Rails でアプリ固有の設定情報や定数をグローバルに定義するには、app/config/initializers ディレクトリ以下に、設定用のファイルを作成するのが一般的なようです。また、development, test, production など環境で使う値を変更する場合は、設定用の yaml ファイルを作成すると、ruby コード側で Rails.env.production? で判定してやる必要がなくなり楽ができます。
— 環境 —
rails-4.0.1
例えば、外部ウェブサービスの Web API を利用する際に、development 環境と production 環境で API key を使い分ける場合など。
【追記 2014/07/11】
Rails4.1からデフォルトで config/secrets.yml というファイルが用意されており、アプリケーションに固有な定数はそちらで定義したほうが良いかと思います。詳しくは以下のページなどを参考にお願いします。
config/secrets.yml / Ruby on Rails 4.1 Release Notes — Ruby on Rails Guides
Rails4.1のsecrets.ymlはfigaroと違うの? – PILOG
【追記ここまで】
settings.yml に環境ごとの設定を作成
app/config/settings.yml
1 2 3 4 5 6 7 8 9 10 11 |
development: some_web_service: api_key: "api_key_for_development" test: some_web_service: api_key: "api_key_for_development" production: some_web_service: api_key: "api_key_for_production" |
これで、development, test, production と環境ごとに異なる値を設定できます。
initializers 以下に設定情報を読み込むファイルを作成
app/config/initializers/00_load_config.rb
1 2 |
APP_CONFIG = YAML.load_file("#{Rails.root}/config/settings.yml")[Rails.env] SOME_CONSTANT = "some constant" |
YAML.load_file で、作成した設定情報用の yaml ファイルを読み込みます。この時、Rails.env をハッシュのキーとして渡しておく。
環境で異なる値を使う必要がない場合は、00_load_config.rb に直接定数を定義します。例として、SOME_CONSTANT を作成しました。
最後に rails でコンソール(pry)を起動して確認してみました。
1 2 3 4 5 6 7 8 |
$ bundle exec rails c Loading development environment (Rails 4.0.1) [1] pry(main)> APP_CONFIG["some_web_service"]["api_key"] => "api_key_for_development" [2] pry(main)> SOME_CONSTANT => "some constant" |
settings.yml に書いた、development 環境の値が返されています。APP_CONFIG[“キー”] で参照できます。また、SOME_CONSTANT も期待したとおりの値が返されています。
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!