[Ruby on rails] RuboCop（リーダブルコード）① 導入、警告除外編

<h2>初めに</h2>
今回、初めてRubocopを触りました。
当初は、これは一体何の意味があるのか・・・？と思いつつも、
Rubocopの良さがすこーーしだけわかったような気がします。
①では、大量の警告を受けつつも、なんとか警告対応（？？？）し１５件まで減らした流れを記載しています。

<h2>注意</h2>

ちなみに②の記事ではRubocop-airbnbを導入してます。
この記事で記載しているrubocopを入れるより、こちらを入れた方がやりやすいかと思いますので、
初心者の方は、①は読まずに②をおすすめします。。

https://qiita.com/ki_87/items/c09f2c7b924669bb9600

<h2>Rubocopとは？</h2>

コードを見て、ここはこうした方が良いよ〜。
長すぎだよ・・・なんかを教えてくれます。
ただ、Rubocopを入れて、チェックをかけるだけだと物凄く大量に指摘されます（多分・・・）
厳しすぎるルールもあるので、そこは除外したり...
Rubocopの小言を聞きつつ、聞き流しつつ、うまくやっていくのが重要なんじゃないかと
感じています。初学者的には。

<h2>Rubocop導入</h2>

```perl:Gemfile
group :development, :test do
  gem 'rubocop', require: false
end
```

bundle installで導入します。

ターミナルで以下のコマンドを入力するとチェックが始まります。

```
rubocop
```

<h2>1164件の違反が見つかる</h2>

結構な違反が見つかりましたが、大部分はschema.rbの指摘でした。
シングルコーテーションでいいんじゃない？？みたいな。
schema.rbは私が生成してるわけではないし、、そんなこと言われても・・・と思いました。
ので、rubocopの検査対象から外すのが正解だったかもしれません。


![スクリーンショット 2021-08-10 9.45.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/18347103-d585-8efc-7075-c26655d0b358.png)


```perl:rubocopで出た違反の指摘　例①
db/schema.rb:55:14: C: [Correctable] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.
    t.string "action_name"
             ^^^^^^^^^^^^^
```

<h2>自動修正をしてみる</h2>

<h2>自分が記述したわけでもないファイルを自動修正なんかして欲しくない！！！方は次へ</h2>

違反の指摘で```Correctable```となっているところは、自動修正できるよ〜:fist:という箇所です。
ターミナルで、以下のコマンドで自動修正できます。

```
rubocop --auto-correct 
```

<h3>そもそも自動修正って大丈夫？？</h3>

```rubocop --auto-correct```で自動修正されるものは、
safeマークが付いているもの＝挙動に影響は無いと判断されてるもの　だそうです。

```rubocop --auto-correct```を実施すると、
```rubocop -A```をするように言われますが、```rubocop -A```は、
unsafeのもの＝挙動に影響あるかも...まで修正されてしまいますので要注意です。

```
131 files inspected, 1361 offenses detected, 1047 offenses corrected,
 149 more offenses can be corrected with `rubocop -A`
```

```rubocop --auto-correct```の後、サーバー起動してみましたが、
特に挙動に影響はありませんでした。

<h2>.rubocop_todo.yml/.rubocop.ymlの作成</h2>

rubocopを実行してバーーっと出てくる警告をファイルへ移動することができます。
ターミナルで以下のコマンド実行すると、
.rubocop_todo.yml/.rubocop.yml　の２つが作成され、
警告内容は、todoに入ります！

```
rubocop --auto-gen-config 
```

<h3>チェックして欲しくないファイルを指定する</h3>

自分が書いたわけでもないファイルを自動で修正されるのって嫌だなぁと思う場合は、
.rubocop.ymlに以下の通り記載します。
以下のファイルはチェックを受けなくなります。
私は、safeな自動修正を行なった後にこのファイルを作成しましたが、
最初からこうすればよかった...と思いました。

```perl:.rubocop.yml

inherit_from: .rubocop_todo.yml

AllCops:
  TargetRubyVersion: 2.7.1　
  TargetRailsVersion: 6.0.3.4　
  Exclude: 
    - "vendor/**/*" # rubocop config/default.yml
    - "db/schema*.rb"
    - "node_modules/**/*"
    - "db/migrate/**/*" 
    - "app/channels/**/*"
    - "config/**/*"
    - "config.ru"
    - "bin/**/*"
    - "public/**/*"
    - "tmp/**/*"
    - "log/**/*"
    - "test/**/*"
 ```
お好みで追加すれば良いかと思います。個人的には、
- "Gemfile"
- "Rakefile"
- "helpers/**/*"
- "db/seeds.rb"　　　も追加してしまいました。

一番上の```inherit_from: .rubocop_todo.yml```を残していると、
.rubocop_todo.ymlに逃した警告は表示されなくなります！！！
ターミナルに出力させたい場合には、コメントアウトしてください。
（正直、.rubocop_todo.ymlで警告の内容みるよりも、ターミナルでみた方が
わかりやすいと思います。）

<h2>もう一度rubocopしてみる！</h2>
```inherit_from: .rubocop_todo.yml```をコメントアウトし、
もう一度ターミナルで、```rubocop```してみます。

![スクリーンショット 2021-08-10 12.35.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/1d389fd4-c527-82d5-ca46-01b6e8546171.png)

コメントアウトも指摘されてますね。。日本語はNGみたいです。
こういうところも、別に検査しなくて良いということを、あらかじめファイルに書いておくと良いですね。。

<h2>あらかじめ除外すべき！？警告対応集〜細かい警告編〜</h2>

以下のような細かい警告は、事前にでないようにしておくとよかったのかもしれません。

http://vdeep.net/rubyonrails-rubocop

<h4>①コメントアウトが引っかかる</h4>
日本語でコメントアウトしてると全部！警告に引っかかってきます。:frowning2:

.rubocop.ymlに以下の通り記載します。

```
Style/AsciiComments:
  Enabled: false
```


<h4>②Missing top-level</h4>

一行目にいきなり class ~~ と書いてあるとこうなるようです。

```
app/controllers/application_controller.rb:1:1: C: Style/Documentation: Missing top-level class documentation comment.
class ApplicationController < ActionController::Base
^^^^^
```

.rubocop.ymlに以下の通り記載します。

```
Style/Documentation:
  Enabled: false
```

参考サイト　
https://zenn.dev/masa20210102/articles/ac80e973523a96

<h4>③Missing frozen string literal comment.</h4>

```
app/controllers/application_controller.rb:1:1: C: [Correctable] Style/FrozenStringLiteralComment: Missing frozen string literal comment.
class ApplicationController < ActionController::Base
^
```

.rubocop.ymlに以下の通り記載します。

```
Style/FrozenStringLiteralComment:
  Enabled: false
```

参考サイト
https://www.task-notes.com/entry/20160831/1472572735

<h4>④Use nested module/class definitions instead of compact style.</h4>

```
 Style/ClassAndModuleChildren: Use nested module/class definitions instead of compact style.
module Posts::SearchesHelper
       ^^^^^^^^^^^^^^^^^^^^^
```

.rubocop.ymlに以下の通り記載します。

```
Style/ClassAndModuleChildren:
  Enabled: false
```

<h4>⑤Naming/AsciiIdentifiers</h4>


```
 Naming/AsciiIdentifiers: Use only ascii symbols in identifiers.
      tags.delete　Tag.find_by(name: old)

Naming/AsciiIdentifiers: Use only ascii symbols in identifiers.
  　json.id group.id
```

.rubocop.ymlに以下の通り記載します。

```
Naming/AsciiIdentifiers:
  Enabled: false
```

<h4>⑥Layout/LineLength:</h4>

1行80文字以上だとこうなってしまうようです。
以下のように除外するか、設定を変えるか・・、短くするか。。

.rubocop.ymlに以下の通り記載します。

```
Layout/LineLength:
  Enabled: false
```

<h2>ここまでやって、残り15件の警告！</h2>
ようやく15件まで、減らせました。
（もちろん、減らすことが目的ではなく、ちゃんとRubocopの指摘を聞き、（聞き流しつつ）、修正し、
理解してあげることが大事だと思います。）

力つきたので、警告には追って対応していきます。。


<h2>参考にした記事</h2>


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

http://vdeep.net/rubyonrails-rubocop