0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-08-10

初めに

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

注意

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

Rubocopとは?

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

Rubocop導入

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

bundle installで導入します。

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

rubocop

1164件の違反が見つかる

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

スクリーンショット 2021-08-10 9.45.30.png

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"
             ^^^^^^^^^^^^^

自動修正をしてみる

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

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

rubocop --auto-correct 

そもそも自動修正って大丈夫??

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の後、サーバー起動してみましたが、
特に挙動に影響はありませんでした。

.rubocop_todo.yml/.rubocop.ymlの作成

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

rubocop --auto-gen-config 

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

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

.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で警告の内容みるよりも、ターミナルでみた方が
わかりやすいと思います。)

もう一度rubocopしてみる!

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

スクリーンショット 2021-08-10 12.35.03.png

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

あらかじめ除外すべき!?警告対応集〜細かい警告編〜

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

①コメントアウトが引っかかる

日本語でコメントアウトしてると全部!警告に引っかかってきます。:frowning2:

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

Style/AsciiComments:
  Enabled: false

②Missing top-level

一行目にいきなり 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

③Missing frozen string literal comment.

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

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

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

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

Style/ClassAndModuleChildren:
  Enabled: false

⑤Naming/AsciiIdentifiers

 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

⑥Layout/LineLength:

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

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

Layout/LineLength:
  Enabled: false

ここまでやって、残り15件の警告!

ようやく15件まで、減らせました。
(もちろん、減らすことが目的ではなく、ちゃんとRubocopの指摘を聞き、(聞き流しつつ)、修正し、
理解してあげることが大事だと思います。)

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

参考にした記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0