背景
Railsの課題を実施しています。途中で、**「定数の管理にはgem config
を使いましょう」**という指示がありました。「定数管理」という概念がなかったのと、初めて知るgemだったので、調べたことをまとめています。
なぜ、定数を管理する必要があるのか?
調べたところによると、
- 環境ごとに違う定数を用いたい
- いろいろなところに散らばる定数をまとめたい
というような時に定数管理を用いるそうです。特に大規模アプリケーションだと必要なのだとか。
定数管理の方法
定数を管理するgemは数多くあり、パッと調べた限りでも以下のものが出てきました。
gem を使わず、自分で設定ファイルと作られたという方もいました!
【Ruby on Rails】 gem を使わないで環境毎に定数管理をする
そのぐらい「定数管理」は必要な概念なんですね〜
configの特徴
上記で取り上げた2つのgemは、どちらもyml
形式でファイルを管理するようでした。
両者の公式サイトを見比べる限り、config
の方が、体系的に定数を管理できる印象を受けました。
DL数は、config
が1.7k、Settingslogic
が1.4kと、ややconfig
に軍配が上がる模様です。
使い方
インストール
config
では、Gemfile
にgem 'config'
と書いて、bundle install
後
rails g config:install
生成されたファイル
生成されたそれぞれの設定ファイルの役割は以下の通りです。
ファイル名 | 役割 |
---|---|
config/initializers/config.rb | configの設定ファイル |
config/settings.yml | すべての環境で利用する定数を定義 |
config/settings.local.yml | ローカル環境のみで利用する定数を定義 |
config/settings/development.yml | 開発環境のみで利用する定数を定義 |
config/settings/production.yml | 本番環境のみで利用する定数を定義 |
config/settings/test.yml | テスト環境のみで利用する定数を定義 |
なお、インストール時に.gitignore
に追記されていた内容は以下の通りですので。
config/settings.local.yml
config/settings/*.local.yml
config/environments/*.local.yml
上記の設定ファイル+これから作成するファイルのうち、local
で使うものはgithubに上げないようになっているんですね
定数の使い方
今回は、config/settings/development.yml
に以下のように書きました。
user:
name: 'Alice'
すると、こんな形で変数にアクセスできます。
[1] pry(main)> Settings.user
=> #<Config::Options name="Alice">
[2] pry(main)> Settings.user.name
=> "Alice"
[3] pry(main)> Settings.user[:name]
=> "Alice"
[4] pry(main)> Settings.user.to_h
=> {:name=>"Alice"}
先に挙げた設定ファイルのどこに書いても呼び出し方法は同じようでしたが、ファイル間で値が重複した場合、上にあるものは下にあるもので上書きされるようです。
config/settings.yml
config/settings/#{environment}.yml
config/environments/#{environment}.yml
config/settings.local.yml
config/settings/#{environment}.local.yml
config/environments/#{environment}.local.yml
これで、うっかり同じ定数を定義してしまっても安心なのですね
感想等
確かに、今まで config/initializer
だったり、applicatiotn_controller
だったり、色々なところに定数を書いてきましたが、一つにまとまっていると便利かもしれません。
また、config/initializer
に定数を書いていたときは、このファイルにエラーがあるとアプリ全体が起動しなかったので、大きすぎるエラーを出さない上でも便利なのかもしれないです。
今後、使用している場面を見かけたら、使い方を注目してみようと思います^^