Railsで環境変数が読み込まれない？ .envファイルのトラブルシューティングと解決方法

## Railsで環境変数が読み込まれない？ `.env`ファイルのトラブルシューティングと解決方法

### 目次
1. [背景](#背景)
2. [コントローラーでの環境変数の利用](#コントローラーでの環境変数の利用)
3. [私が試したトラブルシューティング手順](#私が試したトラブルシューティング手順)
   - [Railsコンソールで環境変数を確認](#railsコンソールで環境変数を確認)
   - [APIキーの有効性を確認](#apiキーの有効性を確認)
   - [現在のRails環境が`dotenv`を反映する設定になっているか確認](#現在のrails環境がdotenvを反映する設定になっているか確認)
   - [Gem 'dotenv-rails'がインストールされているか確認](#gem-dotenv-railsがインストールされているか確認)
   - [サーバーの再起動を試行](#サーバーの再起動を試行)
4. [解決策：サーバーの再起動](#解決策サーバーの再起動)

---

### 背景

Railsアプリケーションの開発中、コントローラーで環境変数を使用してAPIキーなどの秘密情報を管理することがあります。今回は、Stripe APIキーを使用して支払い処理を行う際に、`.env`ファイルにAPIキーを設定し、コントローラーでこれを参照する形を取っていました。

具体的には、以下のように環境変数を設定しました。

```bash
STRIPE_KEY=your_stripe_key_here
```

そして、Railsコントローラーで次のようにAPIキーを使用して処理を行おうとしました。

```ruby
class PaymentsController < ApplicationController
  def create
    Stripe.api_key = ENV['STRIPE_KEY']
    # 支払い処理のコード
  end
end
```

しかし、実際にリクエストを送信すると、設定したはずのAPIキーが認識されず、以下のエラーメッセージが返ってきました。

```json
{"error":"No API key provided. Set your API key using \"Stripe.api_key = \u003cAPI-KEY\u003e\". You can generate API keys from the Stripe web interface. See https://stripe.com/api for details, or email support@stripe.com if you have any questions."}
```

この記事では、この問題を解決するために試した手順と最終的な解決策について説明します。

### コントローラーでの環境変数の利用

Railsコントローラーで環境変数を利用する際、通常は`ENV`オブジェクトを使用して値を取得します。今回のように、Stripe APIキーを利用して支払い処理を行う場合、以下のように設定します。

```ruby
class PaymentsController < ApplicationController
  def create
    Stripe.api_key = ENV['STRIPE_KEY']
    # 支払い処理のコード
  end
end
```

### 私が試したトラブルシューティング手順

問題を解決するために、以下の手順を試しました。

#### Railsコンソールで環境変数を確認

まず最初に、Railsコンソールを起動し、`ENV['STRIPE_KEY']`を直接確認しました。これにより、環境変数が正しく読み込まれているかどうかを確認しました。

```bash
rails console
```

```ruby
puts ENV['STRIPE_KEY']
```

ここで、期待していたAPIキーが正しく表示されました。つまり、`.env`ファイルが正しく読み込まれていることは確認できました。

しかし、実際にAPIリクエストを送信すると、なぜかAPIキーが認識されず、上記のエラーメッセージが返ってきました。

#### APIキーの有効性を確認

次に、そもそもAPIキーが無効なのではないかと考え、一度APIキーをハードコーディングで試しました。具体的には、以下のようにコントローラー内で直接APIキーを設定してテストを行いました。

```ruby
class PaymentsController < ApplicationController
  def create
    Stripe.api_key = "your_actual_api_key_here"
    # 支払い処理のコード
  end
end
```

このテストでは、正常にリクエストが処理され、正しいレスポンスが返ってきたため、APIキー自体が無効であるという説は否定されました。

#### 現在のRails環境が`dotenv`を反映する設定になっているか確認

次に、現在のRails環境が開発環境（`development`）であり、`dotenv`が読み込まれる設定になっているか確認しました。Railsコンソールを再度起動して、現在の環境を確認しました。

```bash
rails console
```

```ruby
puts Rails.env
```

出力結果は以下の通りです：

```plaintext
irb(main):001> puts Rails.env
development
=> nil
irb(main):002>
```

これにより、環境設定が`development`であり、正しく動作していることが確認できました。

#### Gem 'dotenv-rails'がインストールされているか確認

次に、`.env`ファイルを利用するために必要な`dotenv-rails`が正しくインストールされているか確認しました。`Gemfile`に以下の記述があることを確認し、`bundle install`が正常に実行されていることを確かめました。

```ruby
gem 'dotenv-rails', groups: [:development, :test]
```

#### サーバーの再起動を試行

これらの確認が終わった後、Railsサーバーを再起動することを試しました。

```bash
rails server
```

サーバーを再起動した後、再びAPIリクエストを送信すると、今度は正しくAPIキーが認識され、エラーメッセージが表示されなくなりました。

### 解決策：サーバーの再起動

最終的に、サーバーを再起動することで、環境変数が正しく読み込まれるようになりました。原因は、サーバーが一度起動した時点で読み込んだ環境変数を保持し続けるため、新たな変更が反映されなかったことにありました。サーバーの再起動により、`.env`ファイルが再度読み込まれ、問題が解決されました。

---

この記事が、Rails開発における環境変数の管理やトラブルシューティングの参考になれば幸いです。再起動大事ですね。わかってたつもりでも見落としがちです。自戒の意も込めて以上を備忘録とします。