🤖

Railsにrubocopを導入する

2025/02/09に公開

RuboCopの導入

1. Gemfileへの記述

Gemfile
group :development do
  gem 'rubocop', require: false
  gem 'rubocop-rails', require: false        # Railsのベストプラクティスを教えてくれるとか
  gem 'rubocop-performance', require: false  # パフォーマンス関連
  gem 'rubocop-rubycw', require: false       # Rubyの文法チェックなど
end

2. インストール

$ bundle install

RuboCopの使用方法

初期設定

以下のコマンドを実行すると、デフォルトの.rubocop_todo.yml(ルールを記載したファイル)と.rubocop_todo.yml(ルール違反したリスト)が生成される

$ bundle exec rubocop --auto-gen-config

このコマンドは最初以外にも使えて.rubocop.ymlのルールに基づいて現在のコードをすべてスキャンし、違反したものリスト(.rubocop_todo.yml)を生成するものなので、.rubocop.ymlを調整する際にも使える

.rubocop_todo.ymlに記載されているものについてはRuboCopが無視するので
修正する、修正させたい、修正した、という場合はtodoからその記載部分を削除して、チェックとか修正とかをおこなう

RuboCopにチェックしてもらう

チェックだけして、結果を表示してくれます

$ bundle exec rubocop

RuboCopに修正してもらう

$ bundle exec rubocop -a    # 安全な修正(インデント、改行など)
$ bundle exec rubocop -A    # 積極的な修正(メソッド呼び出し、条件式など)

特定のファイルをチェックしてもらう

$ rubocop [filepath]

特定のファイルを修正してもらう

$ rubocop --autocorrect [filepath]

2025/02/09時点のわたしの.rubocop.yml

.rubocop.yml
inherit_from:
  - .rubocop_todo.yml

require:
  - rubocop-rails
  - rubocop-performance
  - rubocop-rubycw

AllCops:
  # 最新のルールを適用する
  NewCops: enable
  # デフォルトで全部disableにする
  DisabledByDefault: true
  # 何のルールに引っかかったか表示する
  DisplayCopNames: true
  # rubocop-capybaraなどを推奨しない
  SuggestExtensions: false
  # rubocop対象外(リポジトリ毎で調節)
  Exclude:
    - "bin/**/*"
    - "db/**/*"
    - "log/**/*"
    - "tmp/**/*"
    - "vendor/**/*"
    - "lib/tasks/auto_annotate_models.rake"
    - "config/environments/*"
    - "config/puma.rb"
    - "config/initializers/**/*"
    - "config/locales/**/*"

# Rails固有のルール
Rails/Output:
  Enabled: true

# 文字列による配列の%記法のチェック
Style/WordArray:
  Enabled: true
  MinSize: 3

# シンボルの%記法のチェック
Style/SymbolArray:
  Enabled: true
  EnforcedStyle: percent

# # シングルクォーテーションを推奨する
# Style/StringLiterals:
#   Enabled: true
#   EnforcedStyle: single_quotes

# ハッシュのシンボルがどうとかの話
Style/HashSyntax:
  Enabled: true
  EnforcedStyle: ruby19 # ハッシュ記法の統一

# ハッシュリテラル内のスペース
Layout/SpaceInsideHashLiteralBraces:
  Enabled: true
  EnforcedStyle: space # { key: value } など

# メソッド呼び出し時のスペース
Layout/SpaceBeforeFirstArg:
  Enabled: true

# メソッドの改行ルール
Layout/MultilineMethodCallIndentation:
  EnforcedStyle: indented_relative_to_receiver

Rails/Validation:
  Enabled: true

Bundler:
  Enabled: true

Gemspec:
  Enabled: true

Lint:
  Enabled: true

Performance:
  Enabled: true

Rubycw:
  Enabled: true

Security:
  Enabled: true

各gemについてAIに聞いてみた

Q. rubocop-railsは何をしてくれるの?

rubocop-railsは、Ruby on Railsアプリケーション向けの静的コード解析ツールで、Railsに特化したコーディング規約や潜在的な問題を検出します。主な機能は以下の通りです:

1. Railsに特化したコード品質チェック

  • モデル、コントローラ、ヘルパーなどのRailsコンポーネントに関する推奨スタイル
  • Railsベストプラクティスの適用
  • セキュリティ関連の潜在的な問題の検出

2. 具体的なチェック項目

  • データベースマイグレーションの規約
  • ルーティングの適切な記述
  • モデル関連のメソッド使用
  • コントローラのアクション構造
  • データベースクエリの最適化

3. 具体例

例:スコープの定義

# 悪い例
class Product < ApplicationRecord
  def self.active
    where(active: true)
  end
end

# 推奨される例
class Product < ApplicationRecord
  scope :active, -> { where(active: true) }
end

例:セキュリティ関連

# 危険な例
def update
  @user.update(params[:user])  # パラメータの脆弱性
end

# 安全な例
def update
  @user.update(user_params)  # ストロングパラメータを使用
end

Q. rubocop-performanceは何をしてくれるの?

rubocop-performanceは、Rubyコードのパフォーマンスに関する静的解析を行うRubocopの拡張プラグインです。主に以下のような機能があります:

1. パフォーマンス改善の検出

  • 非効率的なメソッド呼び出し
  • メモリ使用に非効率的なコード
  • 不要なオブジェクト生成

2. 具体的な検出例

メソッド呼び出し最適化:

# 非効率的
(1..100).map { |i| i.to_s }

# 推奨
(1..100).map(&:to_s)

配列サイズチェック:

# 非効率的
array.size > 0

# 推奨
!array.empty?

不要なブロック生成:

# 非効率的
[1,2,3].select { |n| n.even? }

# 推奨
[1,2,3].select(&:even?)

注意点

  • すべての指摘が必ずしも大きな改善につながるわけではない
  • プロファイリングツールと併用が推奨される
  • コードの可読性とのバランスも考慮すべき

Q. rubocop-rubycwは何をしてくれるの?

rubocop-rubycwは、Ruby言語の標準的なコーディングスタイルと品質を改善するための静的コード解析ツールです。主に以下のような機能があります:

1. コーディングスタイルの標準化

  • インデント
  • スペース使用
  • メソッド定義
  • クラス構造
  • 命名規則

2. コード品質の向上

  • メソッドの複雑性
  • 重複コードの検出
  • コードの可読性

3. 具体例

条件分岐:

# 非推奨
if condition == true
  do_something
end

# 推奨
if condition
  do_something
end

コード構造の改善

# 複雑な条件分岐
def complex_method
  if condition1
    if condition2
      if condition3
        # 処理
      end
    end
  end
end

# リファクタリング推奨
def complex_method
  return unless condition1 && condition2 && condition3
  # 処理
end

参考URL

https://docs.rubocop.org/rubocop/cops.html
https://qiita.com/terufumi1122/items/ad55bf8713c0df053f58
https://blog.to-ko-s.com/rubocop-setting/
https://hoshinotsuyoshi.com/post/rubocop_yaml/

Discussion