たそらぼ

日頃思ったこととかメモとか。

初めてのHerokuデプロイでハマった(rails)

ruby on rails tutorialで作成したWebアプリをHerokuにデプロイしたら、
むちゃくちゃハマったのでメモ。

ruby : 2.5.0
rails : 5.2.1

Herokuでpstgresqlを使うための変更

Gemfileの編集

デフォルトで指定されているsqlite3のコメントアウトして、
本番環境ではpgを使うように追記する。

##/Gemfileの編集

# Use sqlite3 as the database for Active Record
#gem 'sqlite3'
↑コメントアウト!
 ただこれだとlocalで動かすときにコケるので、なんかいい方法があったら追記します。

group :product do
  gem 'pg'
end
↑追記!
/config/database.ymlの編集
#database.ymlのproduction箇所を下記に編集

production:
  <<: *default
  url: <%= ENV['DATABASE_URL'] %>

これで環境変数DATABASE_URLを参照するようになるそうです。(下記参考)
qiita.com


後はpushしてHerokuにデプロイ

bundle install --without production
git commit -am 'for postgresql'
git push
git push heroic master

なお、bundle installの際に本番環境ではpostgresqlを使うことを反映させるため、--without productionオプションをつけて実行しておきます。
これでうまくデプロイできるはず。

デプロイできているのに"The page you were looking for doesn't exist."が出る

これが意外と解決できなくて苦しみました。
ローカルだと"Yay! You’re on Rails!"の画面が出るのに、なぜかHerokuだとページがないと言われる問題です。
これは、railsの初期のtop画面はHerokuでは上手く表示されないらしく、
コントローラーにアクションを追加して、route.rbでtop画面を設定すると直ることがわかりました。

以下、簡単なサンプルです。

/app/controllers/application_controller.rbにアクションを追加
class ApplicationController < ActionController::Base
  def hello
    render html: "hello, world!"
  end
end
/config/route.rbでtop画面を指定
Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  root 'application#hello'
end

これでHerokuにデプロイした際に"hello, world!"を出力することができます。


ちなみに、プリコンパイルでコケてることもあったようなのですが、私の環境だと大丈夫でした。
何年か前の記事が多いので、最近は大丈夫になったのかな。
qiita.com