Rails での開発では、以下の2つのgemを使い分けたり、併用して設定情報を管理する方が多いかと思います。
- config gem
yaml 管理 - dotenv-rails gem
.env(及び環境変数) での管理
ですが、「設定情報を、 yaml に記載したのか、.env(及び環境変数)に記載したのか?」と分からなくなり手が止まる瞬間があります。
なので、最近は config gem を介して .env を参照するようにして、設定情報の参照先を一本化しています。
その中で、以下の 2 つのポイントのどちらかを押さえておかないとエラーになることを確認したので、共有します。
実行環境
- Ruby 3.0.0
- Rails 6.1.4
前提
読み込みの対象になる yaml と、.env ファイルは以下のものになります。
# config\settings.yml
comment: これはテスト用アプリ
# .envに記載した環境変数 SAMPLE_API_KEY の内容を読み込む
sample_api_key: <%= ENV.fetch('SAMPLE_API_KEY') %>
# .env
# config\settings.ymlから参照される
SAMPLE_API_KEY=sample_api_key
注意するポイント
次に示す 2 つプランのうちどちらかを守らないと、以下のようなエラーになります。
# エラー内容
(erb):2:in `fetch': key not found: "SAMPLE_API_KEY" (KeyError)
プラン A:Gemfile で dotenv-rails gem を先に記述する
Gemfileにて、dotenv-rails
gem を読み込んでから config
gem を読み込むようにします。これだけでエラーを回避できます。
# NG
gem 'config'
gem 'dotenv-rails'
# OK
gem 'dotenv-rails'
gem 'config'
プラン B:yaml ファイルでロードメソッドの実行する
gemfile での、記述の順番に配慮しなくても yaml 内で、Dotenv::Railtie.load
を実行することで、エラーを回避して読み込みできます。
プランAと比べて、明示的に .env が参照されていることがわかるという利点があります。
# <% Dotenv::Railtie.load %> を追加する
<% Dotenv::Railtie.load %>
comment: これはテスト用アプリ
sample_api_key: <%= ENV.fetch('SAMPLE_API_KEY') %>
それでは皆さん、安全で便利に設定情報を管理していきましょう。