Railsチュートリアル1
この年始の休みを使ってRailsチュートリアルを初めてみたが、1章のHerokuへのデプロイで詰まってしまった。
開発環境はAWS Cloud9、ライブラリはBitbucket、本番環境としてHerokuへのデプロイを行ってHello, world!プログラムをデプロイしたところ503エラーが出てしまった。ちなみに開発環境の方では同じソースコードで問題なく動作している。
作業としては特段変なことはしていなくて、かなり忠実にチュートリアルの内容を進めていたつもり。
エラー内容
エラーページを見るとHerokuのコマンドを使ってログメッセージを確認しろ、みたいになっているのでターミナルでログを確認したところ以下のようなメッセージが出ていた。
rescue in spec': Specified 'sqlite3' for database adapter, but the gem is not loaded. Add gem ‘sqlite3’` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord). (Gem::LoadError) |
「splite3がデータベースのアダプターになっているけどロードされていないよ。」みたいなメッセージに読める。
ただ、ここはチュートリアル上で説明があって、Herokuではsqliteがサポートされていないのでpostgresqlを使用する、ということでgemfileを以下のように記述するように指示されていた。
source ‘https://rubygems.org’ ・ ・ group :development, :test do gem ‘sqlite3’, ‘1.3.13’ gem ‘byebug’, ‘9.0.6’, platform: :mri end ・ ・ group :production do gem ‘pg’, ‘0.20.0’ end ・ ・ |
データベースのadapterってどこで設定しているのかなと思って調べてみたところ、「config/database.yml」ということが分かって、確かにそこにはdefault設定としてadapterをsqlite3に設定していて、developmentでもtestでもproductionでもこれを読み込んでいたようだった。なんだよこれ変えないといけないのではないかと思って調べてみたけど、ここはデプロイ時に自動的に書き換えられるらしくてあんまり気にするところじゃない?とかいう情報も出てきてハマってしまった。
案外Railsチュートリアルのこの部分で止まっている人は多いのか知恵袋みのあるサイトでの質問と回答を見ていたところ以下のサイトが参考になった。
結果、 「config/database.yml」の内容を以下に修正したら普通に動きましたとさ。
default: &default adapter: sqlite3 pool: <%= ENV.fetch(“RAILS_MAX_THREADS”) { 5 } %> timeout: 5000 development: <<: *default database: db/development.sqlite3 test: <<: *default database: db/test.sqlite3 production: <<: *default adapter: postgresql |
追記
2章に入って別のアプリケーションをHerokuにデプロイしたところ、database.ymlの記述を変更しなくてもうまく動作した。
本事象が発生した際にはgemfileへの記述内容が最初コミットされていなかった疑惑があり、Herokuの環境にsqlite3が誤ってロードされてしまっていたのかもしれない。結果、明示的に設定を変更しない限りそちらを参照してしまうような挙動だった可能性がある。
最近のコメント