LoginSignup
63
8

【Ruby on Rails】RuboCopでコードの治安を守ろう

Last updated at Posted at 2023-12-05

まえがき

本記事は、DMM WEBCAMP Advent Calendar 2023 5日目記事です。

Ruby on Railsを中心に、DWCメンター・卒業生が記事を投稿しておりますので、是非他の記事もご確認ください!

はじめに

こんにちは、DMM WEBCAMP メンターの @ukwhatn です。

本カレンダー3回目の担当日となりますが、今日はRuby on RailsにおけるRuboCopの使い方について説明していきます。

Rubocopとは?

RuboCopとは、Ruby向けのlinter、つまり静的コード解析ツールです。

待ってよ、そもそもlinterって?

linter(リンター)とは、ソースコードを実行前に解析することで、事前にバグやコーディングミスを検出したり、コミュニティやプロジェクトが定めたコーディング規約から逸脱している箇所を警告してくれるツールです。

日本語では一般に「静的解析」と言ったりします。

全てのバグを発見してくれるわけではありませんが、少なくともポカミスによるバグやエラーを防いだり、PJ内で最低限維持するべき秩序を守ってくれることが期待されます。

ロボコップではありません。
ロゴ(下記)から考えて明らかに元ネタにはしていますが、ルボコップです。

image.png
source: https://github.com/rubocop/rubocop

RuboCopのデフォルト設定では、Ruby Style Guideに記載されている規約から逸脱したコードを警告対象としています。

RailsにおけるRuboCopの使い方

インストール

RailsでRuboCopを使うときは、Gemfileに追加するのが楽です。
スタンドアロンで動作するツールなので、require: falseをつけ、development/testグループに追加します。

group :development, :test do
  # ...
  # 元々あるGem
  # ...
  gem "rubocop", require:false
  gem "rubocop-performance", require:false
  gem "rubocop-rails", require:false
  gem "rubocop-rspec", require:false
end

4つもGemを入れるの?

かつてのRuboCopには、RailsやRspecに関するlinterが含まれていましたが、数年前に独立し、個別のGemになっています。

今回はRailsアプリを対象としたlintingを行うので、これらも同時にインストールします。

なお、公式ではバージョンロックが推奨されています。
特に理由がなければ、以下のようにバージョンを明示しておきましょう。

gem 'rubocop', '~> 1.58', require: false

記述したらbundle installコマンドを実行してインストールしましょう。

実行

実行は、ターミナルで以下コマンドを実行するだけです。

$ rubocop

以下のように、何も表示されなければ怒られるところのないコードということです。
image.png

なにか規約に違反している部分があれば、以下のように警告が出ます。

image.png

ここでは、引数名の後のコロンと、渡している変数名の間に空白がありません。

さて、このエラーメッセージの中に [Correctable]と記載されていることに気付いたでしょうか。

これが付記されているエラーについては、以下コマンドで自動修正できます。

rubocop -a

もちろん全てがこれで治るわけではありませんが、軽微な修正であればこのコマンドで事足りるので、覚えておくと良いでしょう。

また、行数の後ろに書いてあるCは違反レベルを示します。
上から深刻度が高く、

F : Fatal
W : Warning
E : Error
C : Convention

となっています。
修正検討時の参考にしてください。

RuboCopのカスタマイズ

コードの特定部分のみrubocopの除外対象とする

コードの可読性などの観点から、どうしても一部分だけRuboCopの規約に反する書き方をしたい場合は、以下で除外対象に設定できます。

# rubocop:disable Style/StringLiterals. Layout/LineLength

def example

end

def 
...

# rubocop:enable Style/StringLiterals. Layout/LineLength

これにより、disableenable の区間で Style/StringLiterals, Layout/LineLengthの2つのCop(lintルールのカテゴリのことです)が抑止されます。

全てのCopを無効にしたい場合は rubocop:disable allと記載しましょう。

なお、特定のメソッドにだけ適用したい場合は

def example # rubocop:disable all
  ...
end

とだけ書けばOKです。

また、1行だけ適用したい場合は

example() # rubocop:disable all

のように行末にdisableコメントを付けてください。

特定のCopのみ実行/規約を変更

PJによっては、特定のlintのみ実行したい場合や、コーディング規約をカスタムしたい場合があるでしょう。

その場合は、.rubocop.ymlで設定しましょう。

まずは、設定ファイル生成のために以下のコマンドを実行します。

$ rubocop --auto-gen-config

実行すると、.rubocop_todo.yml.rubocop.ymlの2つのファイルが生成されます。

.rubocop_todo.yml

.rubocop_todo.ymlは、「今違反している部分を一旦除外対象として無視する」ために生成されます。
PJの途中からRuboCopを導入した場合、往々にして大量の怒られが発生します。

これを一旦TODOとして置いておいて、これから各部分だけを対象にするために生成されるものです。

記述は各カテゴリごとになっており、Excludeに該当するファイルが記載されています。

Style/ClassAndModuleChildren:
  Exclude:
    - 'test/channels/application_cable/connection_test.rb'
    - 'test/test_helper.rb'

ここに記載されているファイルを適宜修正し、.rubocop_todo.ymlから削除していきましょう。

.rubocop.yml

本題の「規約のカスタマイズ」や「どのCopを実行するか」はここで設定していきます。

設定方法や設定例は別記事にお任せしますが、必要に応じて設定してください。


今回は、Rubyの静的コード解析ツール「RuboCop」のRailsにおける使い方をざっと解説しました。

これをGitHub Actionsに組み込むことで、Rspec等とあわせてCI(Continuous Integration)と呼ばれる自動テストの一部とすることができます。
是非お試しください!

63
8
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
63
8