紙一重の積み重ね

35歳のエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【Rails5】RuboCopから指摘されたエラーと解決策のまとめ

はじめに

はじめてのRailsプロジェクトで作成したプルリクエストで、RuboCopから指摘された事項をまとめます。

RuboCopとは

Rubyのコードが「コーディング規約どおりに書かれているか」をチェックする静的コード解析ツールです。 私のようなRails初心者にはとてもありがたいツールです。

RuboCopの実行コマンド

$ bundle exec rubocop

指摘事項

Use %i or %I for an array of symbols.

指摘例

app/controllers/hoge1s_controller.rb:4:36: C: Use %i or %I for an array of symbols.
  before_action :new_hoge1, only: [:index, :new]
                                   ^^^^^^^^^^^^^^

詳細

配列を指定する際に、%iまたは%Iがない。

【参考】Ruby 2.4.0 リファレンスマニュアル > リテラル %記法

  • %i
    • 要素がシンボルの配列(空白区切り)
  • %I
    • 要素がシンボルの配列(空白区切り)。式展開、バックスラッシュ記法が有効

修正内容

配列を指定するときに、%iまたは%Iをつける。

  before_action :new_hoge1, only: %i[:index, :new]

':' and ',' are unnecessary and may be unwanted in the resulting symbols.

指摘例

app/controllers/hoge1s_controller.rb:4:36: W: Within %i/%I, ':' and ',' are unnecessary and may be unwanted in the resulting symbols.
  before_action :new_hoge1, only: %i[:index, :new]

詳細

':'と '、'は不要であり、結果として生じるシンボルで望ましくないかもしれません。

修正内容

配列内から:および、,を削除。

  before_action :new_hoge1, only: %i[index new]

Put empty method definitions on a single line.

指摘例

  def index
  end

詳細

空のメソッドは1行で定義する。

修正内容

空のメソッドは1行で定義する。 また、アクションの後ろにセミコロンを付与する。

  def index; end

Keep a blank line before and after private.

指摘例

app/controllers/hoge1s_controller.rb:47:3: C: Keep a blank line before and after private.
  private
  ^^^^^^^

詳細

privateキーワードの前後には空白行を入れる。

修正内容

詳細の通り。

Inconsistent indentation detected.

指摘例

app/controllers/hoge1s_controller.rb:48:5: C: Inconsistent indentation detected.
    def new_hoge1 ...
    ^^^^^^^^^^^^^^

詳細

インテンドの不一致。

今回は、privateメソッドのインテンドが不一致だと指摘されていました。 Railsチュートリアルの記載方法に習いましたが、Rubocop的にはダメなんですね。 (privateメソッドの下は1段下げておいた方が見やすくないか???)

  private

    def new_hoge1
      @hoge1 = hoge1.new
    end

修正内容

インテンドを半角スペース4つから、半角スペース2つに修正。 また、privateキーワード以下がprivateメソッドであることが分かるように記号を追加。 (先輩からのアドバイスに習いましたが、世の中的にどうなんだろう?)

  private ###################################################################################################

  def new_hoge1
    @hoge1 = hoge1.new
  end

Indent ) the same as the start of the line where ( is.

指摘例

app/controllers/hoge1s_controller.rb:57:9: C: Indent ) the same as the start of the line where ( is.
        )
        ^

詳細

)のインテンドは、先頭の(と同じにする。

    params.require(:hoge1).permit(
      :hoge1_code,
      :hoge1_name_ja,
      :hoge1_name_en
      )

修正内容

)のインテンド位置を、先頭の(と同じになるように修正。

    params.require(:hoge1).permit(
      :hoge1_code,
      :hoge1_name_ja,
      :hoge1_name_en
    )

Extra empty line detected at class body end.

指摘例

app/controllers/hoge1s_controller.rb:75:1: C: Extra empty line detected at class body end.
app/models/hoge1.rb:8:62: C: Space inside } missing.
                          uniqueness: { case_sensitive: false}
                                                             ^

詳細

クラス本体の最後で余計な空行が検出された。

  def set_order_move
    self.move_order_item = hoge1
  end

end

修正内容

最後のendの前にある余計な空行を削除する。

  def set_order_move
    self.move_order_item = hoge1
  end
end

Align the elements of a hash literal if they span more than one line.

指摘例

app/models/hoge1.rb:10:25: C: Align the elements of a hash literal if they span more than one line.
                        presence: true
                        ^^^^^^^^^^^^^^

詳細

ハッシュリテラルの要素が複数の行にまたがっている場合は、それらの要素をそろえる。

  validates :hoge1_name_ja, length: { maximum: 50 },
                        presence: true

修正内容

EnforcedColonStyle key(デフォルト) でチェックしているため、キーを左揃えにする。

  validates :hoge1_name_ja, length: { maximum: 50 },
                             presence: true

Final newline missing.

指摘例

app/decorators/hoge1_decorator.rb:4:4: C: Final newline missing.
end

詳細

最終行に改行がない。

修正内容

最終行に改行を追加する。

Space inside } missing.

指摘例

app/models/hoge1.rb:8:62: C: Space inside } missing.
                          uniqueness: { case_sensitive: false}
                                                             ^

詳細

内側のスペースがない。

修正内容

falseの後ろにスペースを追加。

  validates :hoge1_code, length: { maximum: 15 },
                          presence: true,
                          uniqueness: { case_sensitive: false }