🤖
Railsにrubocopを導入する
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
Discussion