Railsチュートリアルの第1章でHerokuにデプロイできずに早速挫折しかけました。
今後、Railsチュートリアルを行う方が同じ思いをしないでいいように対処方法をまとめておきます。
目次
問題の概要
「1.5.2 Herokuにデプロイする」でHerokuにデプロイ後に、デプロイしたアプリ(Hello, World!と表示するのみ)を表示しようとするとアプリケーションエラーとなり「Hello, World!」が表示されない。
こんな感じの画面になります。
エラー発生までの手順
1.5.1 HerokuセットアップにてHerokuではデータベースがPostgreSQLになるため、Gemfileの本番環境用のDBをPostgreSQL(pg)に変更します。
1 2 3 |
group :production do gem 'pg', '0.20.0' end |
最終的にはGemfileを以下のように修正するように言われるので、指示通りに修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
source 'https://rubygems.org' gem 'rails', '5.1.6' gem 'puma', '3.9.1' gem 'sass-rails', '5.0.6' gem 'uglifier', '3.2.0' gem 'coffee-rails', '4.2.2' gem 'jquery-rails', '4.3.1' gem 'turbolinks', '5.0.1' gem 'jbuilder', '2.7.0' <span style="color: #ff0000;"><strong># 開発、テスト用環境にはSQLIte3をインストール</strong></span> group :development, :test do gem 'sqlite3', '1.3.13' gem 'byebug', '9.0.6', platform: :mri end group :development do gem 'web-console', '3.5.1' gem 'listen', '3.1.5' gem 'spring', '2.0.2' gem 'spring-watcher-listen', '2.0.1' end <span style="color: #ff0000;"># 本番環境にはPostGreSQLをインストール</span> group :production do gem 'pg', '0.20.0' end # Windows環境ではtzinfo-dataというgemを含める必要があります gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby |
本場用以外のgemをインストールするために以下のコマンドを実行します。
1 |
$ bundle install --without production |
その後、以下のコマンドでherokuにブランチを作成します。
1 |
$ heroku create |
この時に「bundle install」が実行されます。
この状態でアプリケーションをHerokuにデプロイ(push)したとしてもPostgreSQLのgemがインストールされていないため、アプリケーションエラーとなってしまいます。
「heroku logs」でログを確認してみます。
*「heroku logs」はHerokuのログを確認するコマンドです
1 2 3 4 5 6 7 8 |
$ heroku logs # 実行結果 ・ ・ ・ 2019-12-04T21:30:10.139048+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=fast-taiga-08531.herokuapp.com request_id=92e29951-9727-4dd6-95f6-6c3db042a603 fwd="175.28.223.131" dyno= connect= service= status=503 bytes= protocol=https 2019-12-04T21:30:11.117208+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=fast-taiga-08531.herokuapp.com request_id=de7e4494-a7e2-4bfc-90fb-728f78e3846a fwd="175.28.223.131" dyno= connect= service= status=503 bytes= protocol=http |
エラーが出てるのはなんとなく分かりますが、原因が分かりません。
そこで、「heroku run rails console」を実行してみます。
*「heroku run rails console」はHeroku上のRailsコンソールを起動するコマンドです
1 2 3 4 5 6 7 |
heroku run rails console # 実行結果 ・ ・ ・ `rescue in spec': Specified 'sqlite3' for database adapter, but the gem is not loaded. |
「sqllite3のgemがインストールされてません」的な感じのメッセージです。
この状態が出たまま「heroku create」時に表示されたURLか「heroku open」を実行すると上記のアプリケーションエラーの画面となります。
エラーの原因と解消方法①:本番環境がSQlite3に接続しようとしている
上記のエラーの場合は本番環境用にsqlite3のgemがインストールされていない以前に、herokuはSQlite3に対応していないにも関わらず、SQlite3に接続しようとしていることが問題となります。
エラーの原因①
この場合は、データベースの接続を管理している「config/databese.yml」の記述を見直す必要があります。
僕の場合は以下のようになっており、本番環境(production)もSQlite3を使用する設定となっていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# SQLite version 3.x # gem install sqlite3 # # Ensure the SQLite 3 gem is defined in your Gemfile # gem 'sqlite3' # default: &default adapter: sqlite3 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000 development: <<: *default database: db/development.sqlite3 # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: db/test.sqlite3 production: <<: *default database: db/production.sqlite3 |
エラーの解消方法①
上記のproductionの設定を以下のようん修正してPostgreSQLを使用するようにすればOKです。
1 2 3 4 5 6 7 |
# production: # <<: *default # database: db/production.sqlite3 production: <<: *default adapter: postgresql database: db/production.pg |
databese.ymlの設定内容
- adapter
使用するデータベースの種類。
アダプタには各データベースに対応するsqlite3, postgresql, mysql2, oracle_enhanced などがあります。 - encoding
文字コード - database
データベース名 - username
データベースに対するユーザー名 - password
データベースに対するパスワード - hots
接続先データベースが起動しているサーバーのIPアドレス(ホスト名)
エラーの原因と解消法②:本番環境用のgemがインストールされない
エラーの原因①を解消したらうまくいく方もいるかもしれませんが、僕と同じようにRailsチュートリアルの手順に沿ってセットアップしている場合は、おそらく原因①を解消して、デプロイしても現象は解消されないと思います。
「heroku run rails console」を確認すると以下のようなエラーが確認できると思います。
1 2 3 |
$ heroku run rails console /app/vendor/bundle/ruby/2.4.0/gems/activerecord-5.1.6/lib/active_record/connection_adapters/connection_specification.rb:188:in `rescue in spec': Specified 'postgresql' for database adapter, but the gem is not loaded. Add `gem 'pg'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord). (Gem::LoadError) |
本番環境にPostgreSQL(pg)のgemをインストールする必要があるよ的なエラーです。
エラーの原因②
これは1.5.1 Herokuセットアップにて実行する本番環境用以外のgemをインストールするコマンド。
1 |
$ bundle install --without production |
このコマンドの「–without production」が「本番環境以外の」ということを指示しており、このコマンドを実行した結果、「.bundle/config」の内容が以下のようになってしまいます。
※「.bundle/config」は「bundle install」の設定ファイルになります。
1 2 |
--- BUNDLE_WITHOUT: "production" |
設定ファイルで「本番環境以外以外の」と設定されているため、この状態ではいくら「bundle install」しても本番環境用のgemはインストールされません。
エラーの解消方法②
「.bundle/config」ファイルの内容を以下のように修正すればOKです。
1 2 |
--- #BUNDLE_WITHOUT: "production" |
これでherokuにデプロイ(push)してあげれば問題は解消できるはずです。
まとめ
人によってはエラーが出ない場合もあるかもしれませんし、エラーの原因のどちらかしか発生しない可能性はありますが、万が一僕と同じようにエラーとなった場合の参考となれば幸いです。
Railsでのアプリケーションの作成に重きをおく場合は、どうしてもエラーが解消できなければHerokuへのデプロイはとりあえず諦めるというのも一つの選択肢だと思います。
2020年2月8日追記
最新のRailsチュートリアル第6版では上記と別のエラーが発生してHerokuにデプロイできないことが発生します。
そちらについても別の記事で対処方法を紹介しているので、そちらも参照してもらえると幸いです。