rails new からrails serverまでの流れ

この記事は`rails new`したい時に色々忘れていたりするので**自分用のメモです**。
都度更新していくかもしれません。
# rails newまで
gemはvendor/bundleで管理したい

- フォルダ作成からAtomへ移動まで

```
~
❯ cd MyApp

~/MyApp
❯ mkdir portfolio

~/MyApp
❯ cd portfolio

~/MyApp/portfolio
❯ bundle init
Writing new Gemfile to /Users/kn428/MyApp/portfolio/Gemfile

~/MyApp/portfolio
❯ atom .
```
- rails5.2の環境にしたかったので、Gemfileの`gem "rails"`のコメントアウトを外し、`gem 'rails', '~> 5.2.1'`とする
- bundler経由でrailsをインストールする

```
~/MyApp/portfolio
❯ bundle install --path vendor/bundle --jobs=4
```
- `bundle exec`経由で`rails new`にopを付けて実行する  
`.`は現在のディレクトリの意味  
opは`rails new -h`で確認またはググる

```
~/MyApp/portfolio 59s
❯ bundle exec rails new . -B -d mysql --skip-test
       exist
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru
      create  .gitignore
    conflict  Gemfile
Overwrite /Users/kn428/MyApp/portfolio/Gemfile? (enter "h" for help) [Ynaqdhm] Y
```
Gemfileを上書きしていいか聞かれたら`Y`で続行

参考 :
[新規Railsプロジェクトの作成手順まとめ](https://qiita.com/yuitnnn/items/b45bba658d86eabdbb26)
[rails new 手順書](https://qiita.com/youcune/items/312178c54c65f3ab4d42)
# Gemfileに必要なGemを追加
- gemfileに下記をコピペする(**※私の場合**)  
汎用性のためSLIM等は外しておく

```
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.6.4'

gem 'rails', '~> 5.2.1'
gem 'bootsnap', require: false
gem 'mysql2', '~> 0.5.2'
gem 'puma', '~> 3.7'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'jquery-rails', '~> 4.3'
gem 'turbolinks',   '~> 5.0'
gem 'coffee-rails', '~> 4.2'
gem 'jbuilder', '~> 2.5'

group :development, :test do
  gem 'sqlite3', '~> 1.3.6'
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  gem 'spring-commands-rspec'
  gem 'pry-rails'
  gem 'pry-doc'
  gem 'pry-byebug'
  gem 'rails-erd'
  gem 'annotate'
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'rubocop-airbnb'
  gem 'bullet'
end

group :test do
  gem 'capybara'
  gem 'webdrivers'
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```
これで`$ bundle update`したところ下記のエラーが発生

```
An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.
```
様々な対処法があるらしいが私は下記で対処できた
1. `$ brew info openssl`を実行し
`export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"`
`export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"`
この箇所の`""`内の部分をコピーしてメモ帳などで貼っておく(環境によるのでちゃんとコマンドを実行して確認すること)
2. それを下記のコマンドに繋げる
`--with-cppflags`
`--with-ldflags`
3. 最後に`bundle config`コマンドに繋げる
`$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl@1.1/include"`
`$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib"`
すると`.bundle/config`内に追加されている(`--with-cppflags`のほうが上書きされている気がするが気にしないでおく)

```ruby:.bundle/config
---
BUNDLE_PATH: "vendor/bundle"
BUNDLE_JOBS: "4"
BUNDLE_BUILD__MYSQL2: "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib"
```
これで`$ bundle update`したら無事全てインストールできた

参考 :
[mysql2 gemインストール時のトラブルシュート](https://qiita.com/HrsUed/items/ca2e0aee6a2402571cf6)
[Bundlerでビルドオプションを指定する](https://qiita.com/thunders/items/101c6b329830fb1fb27d)
# installしたGemの設定
## Rspec関連を設定する
`$ bundle exec rails generate rspec:install`
`.rspec`のフォルダの中に`--format documentation`を追加する
`config/application.rb`内を下記の状態に変更する

```ruby:.config/application.rb
module Portfolio
  class Application < Rails::Application
  # ...省略...
    config.time_zone = 'Tokyo'
    config.generators do |g|
      g.test_framework :rspec,
                       view_specs: false,
                       helper_specs: false,
                       controller_specs: false,
                       routing_specs: false,
                       request_specs: false
    end
    config.generators.system_tests   = false
    config.generators.stylesheets    = false
    config.generators.javascripts    = false
    config.generators.helper         = false
  end
end
```
`spec/rails_helper.rb`に以下を追記

```
RSpec.configure do |config|
  # ...省略...
  config.include FactoryBot::Syntax::Methods # 追加
end
```
テスト用DBをマイグレーションしておく
`$ bundle exec rails db:migrate RAILS_ENV=test`

- Capybaraの初期設定  
`$ mkdir spec/supports`  
`$ touch spec/supports/capybara.rb`  
`spec/supports/capybara.rb`内に下記を実装

```
RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :selenium_chrome_headless
  end
end
```
`spec/spec_helper.rb`に下記を追加
`require 'supports/capybara'`

- SystemとRequest Specの追加
`$ mkdir spec/system`
`$ mkdir spec/requests`

- Rspecの高速化
`$ bundle exec spring binstub --all`
`$ bin/rspec spec/`のコマンドで動けばok。direnvの設定は次回の機会にまわす

参考 :
[RSpecを導入してテストを書いてみる](http://vdeep.net/rubyonrails-rspec-factorybot-capybara)
[spring と direnv を使って Rails と rspec を高速起動。快適開発はじめる](http://tkengo.github.io/blog/2014/01/24/rails-spring-and-direnv/)
# rails server
`$ bundle exec rails db:create`
`$ bundle exec rails db:migrate`
`$ bundle exec rails s`
無事(http://localhost:3000/) に「Yay! You’re on Rails!」が表示されれば完了
# git init ~ push
使いまわせたら嬉しいのでここまでをgithub等にpushしておく
まず`.gitignore`の中に`/vendor/bundle`を入れておく
`$ echo '/vendor/bundle' >> .gitignore`

```
$ git init
$ git add .
$ git commit -m "first commit"
$ git remote add origin https://github.com/ユーザー名/リポジトリ名.git
$ git push -u origin master
```
以上です。何かアドバイス等ありましたらコメントいただけると嬉しいです。