【Ruby on Rails チュートリアル】一度作成したherokuアプリを作り直すときの復旧手順

## はじめに
[Ruby on Rails チュートリアル](https://railstutorial.jp/) を進めている最中、何らかの理由でherokuアプリを再作成したくなったとき（謎のエラーに苦しんだ時とか）の手順をまとめました

以下、筆者はリモートリポジトリとしてBitbucketではなくGithubを使用していますが、それ以外の開発環境はRails Tutorialに準拠しています。

## 既存のherokuアプリ名を確認
リモート先に設定しているURLから、アプリ名を確認します。

```:Console-input
$ git remote -v
```

```:Console-result
heroku  ssh://git@heroku.com/<アプリ名>.git (fetch)
heroku  ssh://git@heroku.com/<アプリ名>.git (push)
origin  git@github.com:<ユーザー名>/<リポジトリ名>.git (fetch)
origin  git@github.com:<ユーザー名>/<リポジトリ名>.git (push)
```

リモートリポジトリとしてBitbucketを使用している人は、ここの表記が少し異なります。また、リモートの設定次第では、各URLの先頭が「https:~」で始まる人もいると思います。

いずれにせよ、heroku のリモート先に設定されているURL（上2行）のうち、「.git」の直前の文字列が<アプリ名>になりますので、これをコピーして控えておきましょう

## 既存のherokuアプリを削除

herokuの無料枠では、５つまでアプリをデプロイすることができます。

しかし、デプロイ枠が余っている場合でも、デプロイ先が複数存在してしまうことは初学者にとって思わぬ形での混乱を招きかねません。

そのため、既存のアプリは一旦消してしまうことをオススメします（余りの無料枠で新規作成する場合は、本章はスキップして頂いて構いません）

```:Console-input
$ heroku apps:destroy --app <アプリ名>
```

```:Console-result
 ▸    WARNING: This will delete ⬢ <アプリ名> including all add-ons.
 ▸    To proceed, type <アプリ名> or re-run this command with --confirm <アプリ名>
```

<アプリ名>の箇所を、先ほどコピーしたアプリ名をに書き換えてください。

その後、上記のように「本当に消して良いですか？本当に消すなら、アプリ名をもう一回入力してね」という旨のメッセージがきますので、Consoleに＜アプリ名＞を再入力します

```:Console-input
> <アプリ名>
```

これで、一度デプロイしたherokuアプリを消せました。


## 新規herokuアプリの作成

```:Console-input
$ heroku create
```

ここでアプリ名を指定することもできますが、デフォルトだとheroku側で空いているアプリ名を自動で生成してくれます。

console画面から、「https://git.heroku.com/<新規アプリ名>.git」をと書かれている箇所を見つけ、コピーして控えておきましょう

## リモート先の再設定

旧アプリ自体は既に削除済みですが、gitのリモート先が旧アプリのURLのままなので、新アプリのURLに変更します。

```:Console-input
$ git remote remove heroku
$ git remote set-url heroku https://git.heroku.com/<新規アプリ名>.git
```

これで、リモート先の再設定ができました。念のため確認しておきましょう

```:Console-input
$ git remote -v
```

```:Console-output
heroku  https://git.heroku.com/<新規アプリ名>.git (fetch)
heroku  https://git.heroku.com/<新規アプリ名>.git (push)
origin  git@github.com:<ユーザー名>/<リポジトリ名>.git (fetch)
origin  git@github.com:<ユーザー名>/<リポジトリ名>.git (push)
```

herokuのリモート先のURLが、新規アプリ名のものになっていれば、OKです。

※任意ですが、リモートリポジトリにgithubを選択肢しており、herokuへのアクセスをHTTPS経由ではなくSSH経由にしたい場合は、リモート先の設定を下記のように描いてください

```:Console-input
$ git remote set-url heroku ssh://git@heroku.com/<新規アプリ名>.git
```

確認すると、

```:Console-input
$ git remote -v
```

```:Console-output
heroku  https://git.heroku.com/<新規アプリ名>.git (fetch)
heroku  https://git.heroku.com/<新規アプリ名>.git (push)
origin  git@github.com:<ユーザー名>/<リポジトリ名>.git (fetch)
origin  git@github.com:<ユーザー名>/<リポジトリ名>.git (push)
```

これでSSH経由のURLになりました

## 本番環境でのメール設定
「第11章 アカウントの有効化」で「[11.4 本番環境でのメール送信](https://railstutorial.jp/chapters/account_activation?version=5.1#sec-activation_email_in_production) 」まで進んでいる人は、SendGridの再設定が必要です（第11章まで進んでいない人はスキップ）

まずは、SendGridのアドオンを再インストールします。

```:Console-input
$ heroku addons:create sendgrid:starter
```

その後、本番環境の設定ファイル内の「host = ~」の箇所が旧アプリのホストのままになっているので、修正します。

```:config/environments/production.rb
Rails.application.configure do
  .
  .
  .
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  host = '<新規アプリ名>.herokuapp.com'
  config.action_mailer.default_url_options = { host: host }
  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.sendgrid.net',
    :port           => '587',
    :authentication => :plain,
    :user_name      => ENV['SENDGRID_USERNAME'],
    :password       => ENV['SENDGRID_PASSWORD'],
    :domain         => 'heroku.com',
    :enable_starttls_auto => true
  }
  .
  .
  .
end
```

最後に、heroku config内部における、SendGridのユーザー名とパスワードを更新して完了です。

```:Console-input
$ heroku config:get SENDGRID_USERNAME
$ heroku config:get SENDGRID_PASSWORD
```

## 本番環境での画像アップロード
「第13章 ユーザーのマイクロポスト」内の、「[13.4.4 本番環境での画像アップロード
](https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-image_upload_in_production)」まで進めていた人は、heroku configにおけるS3に関する情報の再設定が必要です（第13章まで進んでいない人はスキップ）

```:Console-input
$ heroku config:set S3_ACCESS_KEY="Accessキーを入力"
$ heroku config:set S3_SECRET_KEY="Secretキーを入力"
$ heroku config:set S3_BUCKET="Bucketの名前を入力"
$ heroku config:set S3_REGION="Regionの名前を入力"
```

各パラメータ値を忘れてしまった場合は、[【Railsチュートリアル】S3に画像をアップロードする設定【13章課題】](https://qiita.com/ryuchan00/items/8e414562b7122e7ec4fb)を参考に、AWSコンソールより取得してください。

## デプロイ
最後、新規URLへデプロイをして完了です。

```:Console-input
$ rails test
$ git add -A
$ git commit -m "Recreate heroku app" 
```

まだ第11章まで進んでいなかった人は、今回の一連の作業の中でファイルを一切編集していないはずです。

そのため下記のように「ファイルの変更がないため、commitしません」と言う表示が出るかもしれません。

```:Console-result
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean
```

この場合は、そのまま下へ進んでください。

```:Console-input
$ git push
$ git push heroku
```

「[第6章 ユーザーのモデルを作成する](https://railstutorial.jp/chapters/modeling_users?version=5.1#cha-modeling_users)」まで進めている人は、heroku上でのmigrationも走らせておきましょう

```:Console-input
$ heroku run rails db:migrate
```

加えて、「[第10章 ユーザーの更新・表示・削除](https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#cha-updating_showing_and_deleting_users)」まで進めている人は、忘れずにseedファイルを本番環境に流し込んでおきましょう

```:Console-input
$ heroku run rails db:seed
$ heroku restart
```

## おわりに

以上で、完了です！予期せぬエラーが発生して抜け出せなくなった時は、アプリごと作り直すことでエラーが解消されるケースもあります。よければ参考にしてください。