使ったGemファイルの調べたこと

## 導入したやつ
- pry
- annotate
- faker
- rubocop
- rspec
- rails_best_practices
- bullet

## Gemの入れ方
1. Gemfileを編集
1. `bandle install`の実行

## Gemの説明
### pry
~~~bash:Gemfile
gem 'pry-byebug' # https://github.com/deivid-rodriguez/pry-byebug
gem 'pry-doc'    # https://github.com/pry/pry-doc
gem 'pry-rails'  # https://github.com/rweng/pry-rails
~~~
デバックを楽にするやつ。
コード内にこのコマンドでブレイクポイントに関数を用意しておくことでその時に何が起こったのか（変数に値が入っているかなど）を確認できる。
rails consoleでコマンドを使用することでメソッドの定義やルーティンが確認できる。これらを使用するために別のgem(pry-docとか)を入れないといけないことがあるので注意。

### annotate
~~~bash:Gemfile
gem 'annotate' # https://github.com/ctran/annotate_models
~~~
~~~bash:terminal
rails g annotate:install
~~~
スキーマ情報をモデルファイルで書き出してくれる。マイグレーション時に自動でファイルに書き出すようにterminalでコマンド実行すると便利。

### faker
~~~bash:Gemfile
gem 'faker'  # https://github.com/faker-ruby/faker
~~~
ダミーファイルを生成する。`db/sheeds.rb`を使用してダミーファイルを生成するためこのファイルにスクリプトを書く必要がある。

### rubocop
~~~bash:Gemfile
gem 'rubocop', require: false       # https://github.com/rubocop-hq/rubocop
gem 'rubocop-rails', require: false # https://github.com/rubocop/rubocop-rails
gem 'rubocop-rspec', require: false # https://github.com/rubocop/rubocop-rspec
~~~
~~~yml:.rubocop.yml
# 違反度　C:Convention(慣習違反) W:Warning E:Error F:faral

# 除外ファイルであるtodoを使用する
inherit_from: .rubocop_todo.yml

# オプション機能を関連付ける
require:
  - rubocop-rails
  - rubocop-rspec

# robocopの新しいバージョンを常に探す
AllCops:
  NewCops: enable

# 以下のフォルダはrobocopのチェックから除外
AllCops:
  Exclude:
    - 'vendor/**/*'
    - 'bin/**/*'
    - 'db/**/*'
    - 'tmp/**/*'
    - 'node_modules/**/*'
    - 'lib/tasks/auto_annotate_models.rake'

# railsにカスタマイズされたrobocopを使う
Rails:
  Enabled: true

# 日本語コメントを許可
Style/AsciiComments:
  Enabled: false

# 長文のメソッド名を許可する
Metrics/LineLength:
  Enabled: false

# 文字リテラルがfreezeになることを許可（ruby3.0からは深く考えず追記したほうがよさそう）
Style/FrozenStringLiteralComment:
  Enabled: false

# 余分なスペースを許可する
Layout/ExtraSpacing:
  Enabled: false

# ドキュメントのないpublic classを許可する（大規模開発だと許可しないほうがいいかも）
Style/Documentation:
  Enabled: false
~~~
~~~bash:terminal
rubocop --auto-gen-config
~~~
rubyファイルが適切に書かれているかチェックしてくれる。自動で修正してくれる機能もあるらしい。`rubocop-performance`というのもあるらしいが今回は除外。
関連ファイルである`.rubocop.yml`に各種設定を書き込んでいく。.`rubocop_todo.yml`は一旦警告を無視するファイルを指定するファイルっぽう（ここがまだあやふや）。

### rspec
やったけど今回は時間なさそうだから実装取り消した
~~~bash:Gemfile
gem 'rspec-json_matcher', require: false # https://github.com/r7kamura/rspec-json_matcher
gem 'rspec-rails', require: false # https://github.com/rubocop/rubocop-rspec
~~~
~~~bash:terminal
rails g rspec:install
bundle exec rspec

# 以下が出力されれば導入成功している
No examples found.


Finished in 0.00074 seconds (files took 0.1165 seconds to load)
0 examples, 0 failures
~~~
~~~ruby:spec_helper.rb
# ファイルの一番上に追記
require "rspec/json_matcher"
RSpec.configuration.include RSpec::JsonMatcher
~~~
テストに使うっぽい。`bundle exec rspec`は動作確認コマンド。

### rails_best_practices
~~~bash:Gemfile
gem 'rails_best_practices', require: false # https://github.com/flyerhzm/rails_best_practices
~~~
~~~yml:config/rails_best_practices.yml
AddModelVirtualAttributeCheck: { }
AlwaysAddDbIndexCheck: { }
#CheckSaveReturnValueCheck: { }
#CheckDestroyReturnValueCheck: { }
DefaultScopeIsEvilCheck: { }
DryBundlerInCapistranoCheck: { }
#HashSyntaxCheck: { }
IsolateSeedDataCheck: { }
KeepFindersOnTheirOwnModelCheck: { }
LawOfDemeterCheck: { }
#LongLineCheck: { max_line_length: 80 }
MoveCodeIntoControllerCheck: { }
MoveCodeIntoHelperCheck: { array_count: 3 }
MoveCodeIntoModelCheck: { use_count: 2 }
MoveFinderToNamedScopeCheck: { }
MoveModelLogicIntoModelCheck: { use_count: 4 }
NeedlessDeepNestingCheck: { nested_count: 2 }
NotRescueExceptionCheck: { }
NotUseDefaultRouteCheck: { }
NotUseTimeAgoInWordsCheck: { }
OveruseRouteCustomizationsCheck: { customize_count: 3 }
# Railsがマスアサインメント脆弱性対策を施している
# ProtectMassAssignmentCheck: { }
RemoveEmptyHelpersCheck: { }
RemoveTabCheck: { }
RemoveTrailingWhitespaceCheck: { }
RemoveUnusedMethodsInControllersCheck:
  except_methods:
   - SamplesController#sample_method
RemoveUnusedMethodsInHelpersCheck:
  except_methods:
   - SamplesHelper#sample_method
RemoveUnusedMethodsInModelsCheck:
  except_methods:
   - SampleModel#sample_method
ReplaceComplexCreationWithFactoryMethodCheck: { attribute_assignment_count: 2 }
ReplaceInstanceVariableWithLocalVariableCheck: { }
RestrictAutoGeneratedRoutesCheck: { }
SimplifyRenderInControllersCheck: { }
SimplifyRenderInViewsCheck: { }
#UseBeforeFilterCheck: { customize_count: 2 }
UseModelAssociationCheck: { }
UseMultipartAlternativeAsContentTypeOfEmailCheck: { }
#UseParenthesesInMethodDefCheck: { }
UseObserverCheck: { }
UseQueryAttributeCheck: { }
UseSayWithTimeInMigrationsCheck: { }
UseScopeAccessCheck: { }
UseTurboSprocketsRails3Check: { }
~~~
綺麗なコードを書いているかチェックする。
設定ファイルをいじることでチェック項目をゆるくすることができる。

### bullet
~~~bash:Gemfile
gem 'bullet' # https://github.com/flyerhzm/bullet
~~~
~~~bash:terminal
bundle exec rails g bullet:install
~~~
上記のコマンドを実行すると`config/environments`ディレクトリ内の`development.rb`と`test.rb`に変更が加わる。
~~~ruby:development.rb
config.after_initialize do
    Bullet.enable        = true #Bulletのgemを利用可能にします。でも、何もしません。
    Bullet.alert         = false #ブラウザにJSのアラートを出します。
    Bullet.bullet_logger = true #bulletのログファイルを出します(場所：Rails.root/log/bullet.log)
    Bullet.console       = false #console.logに警告を出します。
    Bullet.rails_logger  = true #railsのログに警告を出します。
    Bullet.add_footer    = false #画面左下にメッセージを出します。
  end
~~~
~~~ruby:test.rb
config.after_initialize do
    Bullet.enable        = true #bulletを有効化するかどうか。falseの場合はbulletが無効になります。
    Bullet.bullet_logger = falset #N+1問題の検知時、bullet専用のログであるlog/bullet.logを出力するかどうか。
    Bullet.raise         = true # raise an error if n+1 query occurs
  end
~~~
追記された部分を編集して設定を行う。


# 参考
https://pikawaka.com/rails/pry

https://qiita.com/tomohiii/items/1a17018b5a48b8284a8b

https://tech.mof-mof.co.jp/blog/rails-annotate/#gem%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

https://qiita.com/yoshi_4/items/ba67b5013eeabcc97d63

https://nishinatoshiharu.com/insatall-rubocop/

https://qiita.com/tomohiii/items/1a17018b5a48b8284a8b

https://zenn.dev/yukihaga/articles/816758ff6f0bdf

https://gist.github.com/linyows/ace586b118f87291ed3e

https://wonderwall.hatenablog.com/entry/2015/08/17/213718

https://techtechmedia.com/rubocop-installation/

https://leanpub.com/everydayrailsrspec-jp/read#chapter-2

https://weseek.co.jp/tech/1409/

https://linyclar.github.io/rails_memos/development_tools/rails_best_practices/

https://qiita.com/sazumy/items/7157446d7c3bfe377d63

https://qiita.com/muroya2355/items/d4eecbe722a8ddb2568b

https://techtechmedia.com/nplusone_query-bullet-rails/