RuboCopでコードを綺麗に

はじめに

チームで開発をしていると各々コードの書き方が異なったり、規約を決めても

規模が大きくなるにつれて規約を維持することが難しくなりレビュワーの負荷が大きくなることがあります。

これらの解決策の一つとしてRailsではコード解析を実行するgemのrubocopを導入することでチームメンバーが一定の規約を守ってコーディングを行うことが出来ます。

今回はそんなrubocopの使い方を紹介します。

https://github.com/rubocop-hq/rubocop

導入

まずはGemfileに以下を追加します。

gem 'rubocop', require: false

 

インストールします!

bundle install

 

これで準備は完了です。

次に使い方を見ていきましょう。

実行方法

実行方法は以下のコマンドを実行するだけです。

これで全てのファイルに対してのチェックが実行されます。

bundle exec rubocop

 

特定のファイルを指定して実行したい場合は以下のコマンドで実行出来ます。

bundle exec rubocop 実行したいファイル

 

bundle exec rubocop app/controllers/sample_controller.rb

 

では実際に使ってみましょう!

実際に動かしてみる

sampleで以下のcontrollerで実際にrubocopを実行してみます。

(処理内容は適当なので理解する必要はありません。)

【app/controllers/players_controller.rb】
class PlayersController < ApplicationController
  def create
    players = params['_json'].map do |c|
      Player.new(
        team_id: c['team_id'],
        player_name: c['player_name'],
        position: c['position']
      )
    end
    Player.import players, on_duplicate_key_update: [:team_id, :player_name, :position]
    render status: 200, json: { status: 200, message: "Success" }
  end
  private
  def create_params
    params.permit(_json: %i[team_id player_name position])
  end
end

 

【rubocop実行結果】

いくつかrubocopから指摘を受けています。

この結果の見方は以下の通りです。

①では実行ファイル数(今回は1ファイル)と実行結果(C)が出力されています。

rubocopの指摘は軽度の順にRefactor, Convention, Warning, Error, Fatalの5段階に分かれています。

今回はCなのでレベル2の指摘になります。

②では具体的な指摘内容が記載されています。

発生箇所と指摘内容が出力されています。

今回は3箇所です。

Style/SymbolArray: Use %i or %I for an array of symbols.

 

内容:シンボルの配列がリテラルで書かれていない。

Metrics/LineLength: Line is too long. [87/80]

 

内容:1行は80文字を超えている。

Layout/EmptyLinesAroundMethodBody: Extra empty line detected at method body end.

 

内容:余計な空行が入っている。

このようにrubocopがチェックして指摘を出してくれます。

③ではチェックファイル数と指摘数を出力してくれます。

では、rubocopの指摘を元にコードを修正します。

class PlayersController < ApplicationController
  def create
    players = params['_json'].map do |c|
      Player.new(
        team_id: c['team_id'],
        player_name: c['player_name'],
        position: c['position']
      )
    end
    Player.import players, on_duplicate_key_update:
                           %i[team_id player_name position]
    render status: 200, json: { status: 200, message: "Success" }
  end
  private
  def create_params
    params.permit(_json: %i[team_id player_name position])
  end
end

【rubocob実行結果】

無事に成功しました!

rubocopの指摘の項目は今回紹介した以外にもたくさんあります。

その都度内容を調べて修正しましょう。

スキップの方法

開発中にどうしてもrubocopの指摘を解決できない場合や指摘をクリアするために無理に修正して可読性が下がってしまうことがあるかと思います。

その場は以下のコメントを該当箇所に記載することで指摘をスキップできます。

# rubocop:disable スキップしたい項目

 

class PlayersController < ApplicationController
  def create # rubocop:disable Style/LineLength
    players = params['_json'].map do |c|
      Player.new(
        team_id: c['team_id'],
        player_name: c['player_name'],
        position: c['position']
      )
    end
    Player.import players, on_duplicate_key_update: %i[team_id player_name position]
    render status: 200, json: { status: 200, message: "Success" }
  end

おわりに

今回はrubocopの簡単な使い方について書きました。

rubocopを導入するとコード規約を守りながらコーディングを進められるので

プロダクト品質を一定に保つことが出来ます。

また、初学者のうちは自分のコードの書き方が正しいのか不安になることもあるかと思います。

rubocopでチェックしながら実装を進めることで綺麗なコーディングが鍛えられます。