Rails アプリの新規作成手順

忘備録として、できるだけクリーンな状態で Railsアプリを作成する方法をまとめてみました。GitHubへの同期、Herokuでの公開までやってみました。

初心者なので、アドバイスをいただければ嬉しいです。


# 開発環境
開発環境: Mac
IDE:  RubyMine
データベース: Postges
開発環境サーバー: puma-dev

# Ruby のアップデート

最新の Ruby を使います。執筆時点（2.7.2）

```
$ brew upgrade rbenv ruby-build
$ rbenv install -l # インストール可能なバージョンのリスト
$ rbenv instal 2.7.2
$ rbenv global 2.7.2
```

# Yarn のインストール

Rails6 から必須になりました。

```
brew install yarn
```

# Rails アプリの作成

rails_app フォルダーに Railsアプリを作っていきます。

```
$ cd rails_app/
$ mkdir app_name
$ cd app_name/
$ bundle init
$ vim Gemfile
```

Gemfileを編集します。

```Gemfile
gem rails #を外す
```

gem を Railsアプリごとにインストールするために、オプション --path vendor/bundleをつけます（rails コマンドに bundle exec をつける必要が出てくる）。データベースとして、Postgres を指定します。

```
$ bundle install --path vendor/bundle
$ bundle exec rails new . --skip-bundle -d postgresql
```

Gemfile を編集して必要なGemを入れる。（特にいじらなくてもよい）
クリーンなインストールのため、もう一度 bundle install します。

```
$ rm -rf .bundle
$ rm -rf vendor/bundle
$ bundle install # 一度、path を指定すると、--path vendor/bundle は不要となる
```

# Postgres

本番環境 Heroku では、データベース Postges を使用する予定なので、開発環境 Mac でも同じものを使用します。

```
$ brew install postgresql
```

バージョン確認

```
$ postgres --version
```

参考）データベースクラスタの場所（インストール時に自動で作成される）
/usr/local/var/postgres


Postgres がデフォルトで参照するデータベースクラスタを設定、パスを通します。ファイルを編集後は source .bash_profile で設定を反映させることを忘れないようにしましょう。

```
$ vim ~/.bash_profile
$ source ~/.bash_profile
```

.bash_profile に追記するコード

```.bash_profile
 # postgres
export PATH=/usr/local/Cellar/postgresql/12.4/bin/:$PATH
export PGDATA=/usr/local/var/postgres
```

Postgres の起動と終了

```
$ pg_ctl -D /usr/local/var/postgres start

$ pg_ctl stop
```

起動した状態でデータベースの作成（macのユーザー名で作ると、database.yml への追加の設定が不要になる。）

```
$ createdb app_name_development -O <mac_user_name>
$ createdb app_name_test -O <mac_user_name>
# 作成したデータベースを確認
$ psql -l
```

参考）config/database.yml に自動的に設定が書き込まれ、次のようになっています。

```config/database.yml
# PostgreSQL. Versions 9.1 and up are supported.
#
# Install the pg driver:
#   gem install pg
# On OS X with Homebrew:
#   gem install pg -- --with-pg-config=/usr/local/bin/pg_config
# On OS X with MacPorts:
#   gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
#   gem install pg
#       Choose the win32 build.
#       Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: app_name_development

----略---

test:
  <<: *default
  database: app_name_test

---略---
```

参考)データベースの削除

```
$ dropdb db_name
```

# Rails アプリ用のテーブルを作成

Postgres に使用するテーブルを作成します。

```
$ cd ~/rails_app/app_name
$ bundle exec rails db:migrate RAILS_ENV=development
$ bundle exec rails db:migrate RAILS_ENV=test
```

Webpack のインストール

```
$ bundle exec rails webpacker:install
```

Railsサーバーの起動

```
$ bundle exec rails server
```


起動の確認
http://localhost:3000

確認取れたら、Ctrl + C でサーバーを終了

# puma-dev

puma-devを使うと、Railsサーバーを起動しなくてよいので便利です。ローカルで https:// 接続できるようになります。

puma-devの導入

```
$ brew install puma/puma/puma-dev
$ sudo puma-dev -setup
$ puma-dev -install -d test # デフォルトで http://appname.dev でアクセスする仕様だが、Chromeでエラーになるため .test に変更する。test でなくても良い
```

puma-devの設定

```
$ cd ~/.puma-dev
$ ln -s ~/rails_app/app_name/ app_name
$ cd ~/rails_app/app_name
$ touch tmp/restart.txt # puma-dev 再起動
```

### （追記）Rails 6から config.hosts の設定が必要になりました。
development.rbに末尾に追記

```config/environments/development.rb
  # Whitelist one hostname
  config.hosts << "app_name.test"
```


確認（rail server は起動しなくて良い）
http://app_name.test

# GitHub

起動の確認が取れましたので、ここで GitHubに保存しておきます。

### vendor/bundle の除外

.gitignore に追記する

```
/.bundle
/vendor/bundle # 追記
```


### RubyMineの設定を保存したくない時

.gitignore に追記する

```
# Ignore IDE settings
/.idea
```

[GitHubサイト](https://github.com) で新しいレポジトリを作成する

![snap_1313.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320718/f4740d73-d87d-3f57-76b7-8b734d961709.png)


初めてのコミットを Pushします。

```
$ git remote add origin git@github.com:creativival/app_name.git
$ git add -A
$ git commit -m 'first commit'
$ git push -u origin master
```

# Heroku

無料で利用できるホスティングサービスで、Railsアプリを公開してみます。

まずは [Heroku](https://www.heroku.com) よりユーザー登録を済ませます。

Railsアプリでページを作っておかないと、Heroku上で表示できないため、トップページのみ作成します。

```
$ bundle exec rails generate controller StaticPages top
```

ルーティングを変更して、ルートにアクセスするとトップページを表示するようにします。

```config/routes.rb
Rails.application.routes.draw do
  root 'static_pages#top'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```

ありがたいことに Heroku は SSL 接続を無料で提供しています。Rails で SSL 接続を使えるように設定します。

```config/environments/production.rb
config.force_ssl = true # コメントアウトを外す
```

本番環境のWEBサーバ（Puma）を設定します。

```config/puma.rb
max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
threads min_threads_count, max_threads_count
port        ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { ENV['RACK_ENV'] || "production" }
pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
workers ENV.fetch("WEB_CONCURRENCY") { 2 }
preload_app!
plugin :tmp_restart
```

Procfileファイルを新規作成して、コードを記入します。

```
./Procfile
web: bundle exec puma -C config/puma.rb
```

Heroku にログインします。メールアドレス、パスワード、2段階認証の数字を入力します。

```
$ heroku login -i
```

Herokuアプリを作成します。

```
$ heoku create app-name # アンダーバーは使えません
$ heroku git:remote -a app-name # git と紐付けする
```
Heroku環境でのデータベースの設定を調べます。

```
$ heroku addons:create heroku-postgresql:hobby-dev # 初回のみ
$ heroku config
DATABASE_URL: postgres://<username>:<password>@<host>:<port>/<database>
```
参考）このデータベースの設定値を使って、RubyMine から接続できます。

![ScreenShot_1652.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320718/5cb5b4f5-815a-fea3-a94b-801074ef9cd2.png)

以上で、rails側の設定はできたので、GitHub に保存します。

```
$ git add -A
$ git commit -m 'heroku settings'
$ git push origin master
```

Heroku にも git push します。

```
$ git push heroku master
```

Heroku環境でテーブルを作成します。

```
$ heroku run rails db:migrate
```

Railsアプリが公開できたか、確認してみます。

https://app-name.herokuapp.com

![snap_1315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320718/b99e319b-e60c-cf03-8d42-ec6249517d8a.png)

# （追記）Herokuへの git pushでエラーが出た時

こちらの記事に助けられました。ありがとうございます。
[[memo] Herokuで Could not find 'bundler' (2.0.1) と言われた](https://qiita.com/amuyikam/items/989300248f471020ca18)

Rubyは最新版を使用していたので、bundlerのみアップデートすることで、deployに成功しました。

```
$ gem install bundler -v 2.0.2
$ rm Gemfile.lock
$ bundle install
$ git add Gemfile.lock
$ git commit -m 'version up bundler'
$ git push origin master
$ git push heroku master

remote: Verifying deploy... done.
```

さあ開発を進めましょう ！