Railsチュートリアル1

2021年2月2日

この年始の休みを使って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. Addgem ‘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が誤ってロードされてしまっていたのかもしれない。結果、明示的に設定を変更しない限りそちらを参照してしまうような挙動だった可能性がある。