解決したいこと
rails s
などrails ~系のコマンドを実行すると、
Cannot load database configuration: (NoMethodError)undefined method []' for nil:NilClass
エラーと表示されて強制終了されるので、正常に起動できるようにしたい。
エラー文から推察するとdatabase.ymlが怪しいかと思われますが、
状況から考えて、master.keyとcredentials.ymlの関係性を疑っております。
自分のスキルレベル(使用言語)
・プログラミング歴7ヶ月
・Rails歴半年(独学)
言葉の定義
・ローカル環境=rails s
で起動した環境。非Docker環境。
・Docker環境=docker-compose up
で構築した環境
その問題が発生するまでの作業手順と、詳細なエラーメッセージ
(1〜3はあまり今回の解決したい問題とは直接関係ないかもしれません)
1.RailsアプリをAWSのECRとECSを利用したデプロイに挑戦していました。
2.ローカル環境で開発したアプリをDocker化した後、docker-compose up
で起動できるようになったのでECSにデプロイしました。
3.デプロイはできたのですが、本番環境でおそらく「ActiveSupport::MessageEncryptor::InvalidMessage 」エラーが発生しました。
(ここは記録していなくて、ログも流れてしまい確認できないです。
ECSの環境変数RAILS_MASTER_KEYの内容はローカル環境のmaster.keyと一致してたはずです)
4.エラーの内容から、master.keyとcredentials.ymlの暗号化問題だと判断して、両方を一度消して再生成したら解決するだろうと思い、2つを削除&「EDITOR=‘code —wait’ rails credentials:edit
」で再生成しました。
5.その後、ローカル環境とDocker環境の両方とも、タイトルのエラーで起動できなくなりました。
自分の期待していた結果、その期待の根拠や参考資料(仮説)、実際の結果
EDITOR='code —wait' rails credentials:edit
(master.keyとcredentials.ymlを再生成するコマンド)を叩くと、
ペアが一致する(master.keyの復元とcredentials.ymlの暗号化ができる)と思うのですが、rails s
とdocker-compose up
両方とも起動できませんでした。
でも、EDITOR='code —wait' rails credentials:edit
を叩くと、
なぜかcredentials.ymlは開くことができます。
これが何故開けるのか分からないです。そもそも原因と見てる箇所が違う?
コマンドでcredentials.ymlが開ける=rails sができる状態だと認識しているのですが、これがそもそも間違いなんでしょうか?
以前にもActiveSupport::MessageEncryptor::InvalidMessageに1日ほど苦しめられた経験があるのですが、今回の原因は全く分からないです。
問題の発生している環境
・macOS catalina 10.15.4
ローカル環境
・ruby 2.5.1
・rails 5.2.4.2
・mysql5.6
Docker環境
・ruby 2.5.1
・rails 5.2.4.2
・mysql5.7
調査内容
エラーメッセージからmaster.keyとcredentials.ymlの関係が原因だと思いましたが、他にも原因があると思って調べました。
Docker環境では、ローカル環境と別のmaster.keyとcredentials.ymlを用意する必要がある?
最初にmaster.keyとcredentials.ymlを削除する前はdocker-compose up
でDocker環境を構築できました。
ですが一度削除した後に起動しなかったので、ローカル環境ではなくDocker上でcredentials.ymlを生成する必要があるのでは?と思い、docker-compose run -e EDITOR=vim app bundle exec rails credentials:edit
のコマンドで生成しましたが結果は変わりませんでした。
master.keyとcredentials.ymlを削除した状態でローカル or Docker環境で起動できるか
いずれも起動できませんでした
同じエラーの遭遇者
おそらくQiitaで全く同じ問題に遭遇されている方がいらっしゃいって解決策を提示していましたが、私の場合は解決に至りませんでした。
何度やってもNill class、原因不明のmigrate faild、問題はcredentials.yml.encが握っていた。
database.ymlの問題
別のRailsアプリで参照元のDB名を変えたりしましたが、同じエラーは再現できませんでしたので、database.ymlに問題はないと思います。
ただ、一つ気になったのが他のアプリのDBを指定しても、同じエラーが出るので今回開発してるアプリに問題があると思っています。
Rails s
時のmaster.keyの参照先が変わっている?
調べたところ、config/master.keyと環境変数のRAILS_MASTER_KEYどちらかを参照するみたいなので、この仮説は間違っていると思います。
下記の手順で検証しましたが、結果は変わらず上記のエラーでした。
1.export RAILS_MASTER_KEY="hoge"
➡️ターミナルで実行
2.echo $RAILS_MASTER_KEY
➡️表示結果:hoge
3.環境変数にmaster.keyがセットされてるのを確認したのでrails s
➡️結果は変わらず
問題に関連している可能性のある設定やコード
・以前credentials.ymlを使用していたコードは記憶の限りだと下記の2つです。
1.database.yml(以前EC2からRDSに接続用)➡️コメントアウト済み
2.carrierwave.rb(S3のアクセスキーとシークレットキー)➡️使用中
ただ、調査の結果から上記の2つは関係なく、master.keyとcredentials.ymlの影響だと考えています。
根拠は、別のRailsアプリ(同バージョン、環境)でcredentials.ymlと一致しない内容を記述しても正常に起動できること、もし一致しない場合はrails s
で起動後のページ表示時にエラーが発生することから、rails s
ができない今回の問題とは別のエラーだと考えています。
GitHubの作業ブランチのリポジトリのURLをシェア
エラーメッセージ全文
2つともmaster.keyとcredentials.ymlは同じもので検証。
DBの接続先が違うので、database.ymlだけ変更。
ローカル環境
database.yml
default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: development: <<: *default database: mynote_development socket: /tmp/mysql.sock
エラー文
MyNote $ rails s => Booting Puma => Rails 5.2.4.2 application starting in development => Run `rails server -h` for more startup options Exiting Traceback (most recent call last): 166: from bin/rails:3:in `<main>' 165: from bin/rails:3:in `load' 164: from /Users/ohishikaido/projects/テックキャンプ/MyNote/bin/spring:15:in `<top (required)>' 163: from /Users/ohishikaido/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require' 162: from /Users/ohishikaido/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require' 161: from /Users/ohishikaido/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `<top (required)>' 160: from /Users/ohishikaido/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `load' # 〜中略〜 43: from /Users/ohishikaido/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/active_support.rb:60:in `load_missing_constant' 2: from /Users/ohishikaido/.rbenv/versions/2.5.1/lib/ruby/2.5.0/erb.rb:876:in `result' 1: from /Users/ohishikaido/.rbenv/versions/2.5.1/lib/ruby/2.5.0/erb.rb:876:in `eval' (erb):43:in `<main>': Cannot load database configuration: (NoMethodError) undefined method `[]' for nil:NilClass
Docker環境
database.yml
default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: development: <<: *default database: mynote_development username: root password: password host: db
エラー文
app_1
1app_1 | undefined method `[]' for nil:NilClass 2app_1 | bundler: failed to load command: puma (/usr/local/bundle/ruby/2.5.0/bin/puma) 3app_1 | NoMethodError: Cannot load database configuration: 4app_1 | undefined method `[]' for nil:NilClass 5app_1 | (erb):43:in `<main>' 6app_1 | /usr/local/lib/ruby/2.5.0/erb.rb:876:in `eval' 7app_1 | /usr/local/lib/ruby/2.5.0/erb.rb:876:in `result' 8app_1 | /usr/local/bundle/ruby/2.5.0/gems/railties-5.2.4.2/lib/rails/application/configuration.rb:172:in `database_configuration'
マルチポストしています
・下記のstack overflowのリンクと質問内容は同じになります。
【Rails】rails sを実行すると「Cannot load database configuration」とエラーが出て強制終了される
・マルチポストをしている理由
転職活動や金銭面の都合で、早く問題を解決させないといけない、と言う思いからです。
ご迷惑をおかけします。泣
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。