新規アプリ作成からHerokuへのデプロイまで。（Cloud9）

※これはRailsチュートリアルの第3章で作成した備忘録です。

新規アプリケーションの作成（`rails new`）から、とりあえずHerokuにデプロイするまでの流れをメモとして残します。
railsのバージョンは`5.1.6`です。
Cloud9での作業が前提です。

# 新規アプリ作成
下記のコードをそれぞれ記入して、新しいアプリケーションを作成します。

```
$ cd ~/environment
$ rails _5.1.6_ new <任意のアプリ名>　# 例） sample_app
$ cd sample_app/
```

# Gemfileの変更

Gemfileに下記のコードをコピペします。

```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'

group :development, :test do
  gem 'mysql2', '~> 0.4.4'
  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

group :test do
  gem 'rails-controller-testing', '1.0.2'
  gem 'minitest',                 '5.10.3'
  gem 'minitest-reporters',       '1.1.14'
  gem 'guard',                    '2.13.0'
  gem 'guard-minitest',           '2.4.4'
end

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

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

Railsチュートリアルとは若干変更しています。
変更した箇所は下記の部分です。
<br/>
こちらは使用するデータベースが`mysql`なので下記のように変更しています。

```Railsチュートリアルのデフォルト.
  gem 'sqlite3', '1.3.13'
```
```変更後.
  gem 'mysql2', '~> 0.4.4'
```
<br/>
Heroku用の設定でバージョンを変更しています。

```Railsチュートリアルのデフォルト.
group :production do
  gem 'pg', '0.20.0'
end
```
```変更後.
group :production do
  gem 'pg', '0.21.0'
end
```

`Gemfile`の変更が終わったら下記を実行します。

```
$ bundle install --without production
```
上記でエラーが起きる場合は、下記を実行してから改めて`bundle install`を実行します。

```
$ bundle update
```
<br/>
ここまで完了したら一度Gitリポジトリを初期化します。

```
$ git init
$ git add .
$ git commit -m "init"
```

# GitHubにプッシュする
GitHubで新規リポジトリを作成します。

```
$ git remote add origin https://github.com/ユーザ名/任意リポジトリ名.git

# 例）　$ git remote add origin https://github.com/taro/sample-app.git
```
登録したリモートリポジトリにプッシュします。

```
$ git push origin master
```

# ブランチを切る
ここから`master`ではなく、ブランチを切りそっちで作業を行います。

```
git checkout -b <任意のブランチ名>
```
これで新しいブランチができました。
確認してみたいと思います。

```
$ git branch
* <任意のブランチ名>
  master
```

無事に新しいブランチができています。
それではこれからこちらのブランチで作業をしていきます。

# Herokuにデプロイをする-01
早い段階でデプロイをして、デプロイが本当に完了しているかを確認するため

とりあえず、仮でルートに"hello, world!"を表示させるようにします。

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  def hello
    render html: "hello, world!"
  end
end
```
```routes.rb
 root "application#hello"
```

ここまで完了したら一度コミットをして、GitHubにもプッシュしておきます。
※一人で運用していることもあり、プルリクをしてマージしてから次の作業に入りました。

マージが完了したら、`masterのブランチ`で`git pull`をすることを忘れないようにしましょう。

```
$ git pull
```
`git pull`が完了したら、先ほどまで作業をしていた`任意のリポジトリ名`に変更して続きをします。

# Herokuにデプロイをする
その前に、`mysql`にした場合、データベースを作る必要があるので、まずはデータベースを作成します。

```
$ rails db:create
```
データベースを作成したら、`config/database.yml`を変更します。
`Heroku`は`mysql`ではなく、`postgreSQL`を使用するからです。
なのでデフォルトは`mysql`で、`Heroku`上だけp`ostgreSQL`にする必要がああります。
`Production:`以下を下記に変更しましょう。

```config/database.yml
production:
  adapter: postgresql
  encoding: unicode
  pool: 5
  database: データベース名 # 例） 「rails db:creat」で作られたDB名（sample_app_developmentなど）
  username: ユーザー名 # 例） sample_app
  password: <%= ENV['MESSAGE-BOARD_DATABASE_PASSWORD'] %>
```

ここまで完了したら、またコミットをしてマージまで行います。

# Herokuにデプロイをする-02
前置きが長かったですが、ここからようやくデプロイを行います。

`masterブランチ`から下記のコードを入力します。

```
$ git push heroku master
$ heroku addons:create heroku-postgresql:hobby-dev
$ heroku run rails db:migrate
```
上記を実行します。
これでデプロイが完了し、無事に表示されているはずです。
<br/>
ちなみに、もしここで下記のようなエラーがあった場合は、Herokuのミスが考えられます。

```
Mysql2::Error: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```