MENU

Railsチュートリアル1章でHerokuにデプロイできない時の対処方法

Railsチュートリアルの第1章でHerokuにデプロイできずに早速挫折しかけました。

今後、Railsチュートリアルを行う方が同じ思いをしないでいいように対処方法をまとめておきます。

目次

目次

問題の概要

「1.5.2 Herokuにデプロイする」でHerokuにデプロイ後に、デプロイしたアプリ(Hello, World!と表示するのみ)を表示しようとするとアプリケーションエラーとなり「Hello, World!」が表示されない。

こんな感じの画面になります。

エラー発生までの手順

1.5.1 HerokuセットアップにてHerokuではデータベースがPostgreSQLになるため、Gemfileの本番環境用のDBをPostgreSQL(pg)に変更します。

group :production do
  gem 'pg', '0.20.0'
end

最終的にはGemfileを以下のように修正するように言われるので、指示通りに修正します。

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'

# 開発、テスト用環境にはSQLIte3をインストール
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

# 本番環境にはPostGreSQLをインストール
group :production do
  gem 'pg', '0.20.0'
end

# Windows環境ではtzinfo-dataというgemを含める必要があります
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby

本場用以外のgemをインストールするために以下のコマンドを実行します。

$ bundle install --without production

その後、以下のコマンドでherokuにブランチを作成します。

$ heroku create

この時に「bundle install」が実行されます。

この状態でアプリケーションをHerokuにデプロイ(push)したとしてもPostgreSQLのgemがインストールされていないため、アプリケーションエラーとなってしまいます。

「heroku logs」でログを確認してみます。
*「heroku logs」はHerokuのログを確認するコマンドです

$ 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コンソールを起動するコマンドです

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を使用する設定となっていました。

# 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です。

# 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」を確認すると以下のようなエラーが確認できると思います。

$ 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をインストールするコマンド。

$ bundle install --without production

このコマンドの「–without production」が「本番環境以外の」ということを指示しており、このコマンドを実行した結果、「.bundle/config」の内容が以下のようになってしまいます。
※「.bundle/config」は「bundle install」の設定ファイルになります。

---
BUNDLE_WITHOUT: "production"

設定ファイルで「本番環境以外以外の」と設定されているため、この状態ではいくら「bundle install」しても本番環境用のgemはインストールされません。

エラーの解消方法②

「.bundle/config」ファイルの内容を以下のように修正すればOKです。

---
#BUNDLE_WITHOUT: "production"

これでherokuにデプロイ(push)してあげれば問題は解消できるはずです。

まとめ

人によってはエラーが出ない場合もあるかもしれませんし、エラーの原因のどちらかしか発生しない可能性はありますが、万が一僕と同じようにエラーとなった場合の参考となれば幸いです。

Railsでのアプリケーションの作成に重きをおく場合は、どうしてもエラーが解消できなければHerokuへのデプロイはとりあえず諦めるというのも一つの選択肢だと思います。

2020年2月8日追記

最新のRailsチュートリアル第6版では上記と別のエラーが発生してHerokuにデプロイできないことが発生します。

そちらについても別の記事で対処方法を紹介しているので、そちらも参照してもらえると幸いです。

あわせて読みたい
【Railsチュートリアル】第6版の1章でHerokuにデプロイできなかった時の対応方法 お久しぶりです。Jyu2です。 最近はブログの更新もままなっていませんが、以前挫折したRailsチュートリアルを再度1からチャレンジしています。 以前は「挫折しないRails...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ソフトウェア会社(SIer)で10年以上勤務のシステムエンジニア|ポケットWiFi使用歴2年以上|ポケットWiFi+αで快適でお得なインターネット環境を構築するための情報を発信|その他、IT情報やWebサービス、アプリ、ガジェットなどの情報を発信|自分と他の人のカバンの中身を紹介するメディア「カバンの中身ラボ(https://kaban-no-nakami-labo.com/)」も運営しています。
ポケットWiFi選びに迷ったらTwitter、お問合せフォームからご連絡ください。

コメント

コメント一覧 (1件)

コメントする

目次