2018年9月13日木曜日

RuboCop さんと付き合う (Style/GuardClause, Layout/IndentationConsistency)

Rails Tutorial を参考にしながら書いた下記のコードで RuboCop さんに指摘されたところに対処していきます。
指摘は2つ。

  • Style/GuardClause: Use a guard clause instead of wrapping the code inside a conditional expression.
  • Layout/IndentationConsistency: Inconsistent indentation detected.

class StaticPagesController < ApplicationController
  before_action :logged_in_user, only: [:my_page]

  def home
    ...
  end

  def my_page
    ...
  end

  private

    # before action
    def logged_in_user
     unless user_signed_in?
       flash[:danger] = 'Please log in.'
       redirect_to root_url
     end
    end
end

Style/GuardClause: Use a guard clause instead of wrapping the code inside a conditional expression.

Offence の内容

app/controllers/static_pages_controller.rb:20:5: C: Style/GuardClause: Use a guard clause instead of wrapping the code inside a conditional expression.
    unless user_signed_in?
    ^^^^^^

参考:
ifとunlessの使い分け - Qiita
ruby-style-guide/README.ja.md at japanese · fortissimo1997/ruby-style-guide

以下のような構成になっているのが良くない様子。

※追記:正常な状態と不正な状態の判定の順番の話かと思っていたのですが、その後調べるとどうやら1行で書くか否かとかそういう話の様子。理解が不十分なのであまりあてにならないです…


# before action
def logged_in_user
  unless user_signed_in?
    # 不正な状態(サインインしていない場合)の時の処理
    flash[:danger] = 'Please log in.'
    redirect_to root_url
  end
  # 正常な状態(サインイン済み)の時はここで抜ける
end

対処

以下のように書き換えるとOKになりました。


# before action
def logged_in_user
  return if user_signed_in? # 正常な状態(サインイン済み)ならここで抜ける
  # 不正な状態(サインインしていない場合)の時はこれ以降に進む
  flash[:danger] = 'Please log in.'
  redirect_to root_url
end

Layout/IndentationConsistency: Inconsistent indentation detected.

Offence の内容

app/controllers/static_pages_controller.rb:18:5: C: Layout/IndentationConsistency: Inconsistent indentation detected.
    def logged_in_user ...
    ^^^^^^^^^^^^^^^^^^

参考:
Class: RuboCop::Cop::Layout::IndentationConsistency — Documentation for rubocop (0.58.2)
Rails enabled true and IndentationConsistency · Issue #3440 · rubocop-hq/rubocop

Rails tutorial 内でお勧めされている private 以下のインデントを一段深くする書き方がRuboCopに引っかかる。

対処

こちらはどうやらRailsとしてはこの書き方もありなようなので、RuboCopの設定を変更して、OKにしてもらいます。

.rubocop.yml に下記を追加。


Layout/IndentationConsistency:
  EnforcedStyle: rails

これで指摘されなくなりました。

追記

当初、上記で参考にしたGitHubからそのままコピペして Style/IndentationConsistency: としていたのですが、気付いたら下記のエラーが出ていました。

.rubocop.yml: Style/IndentationConsistency has the wrong namespace - should be Layout

RuboCop のバージョンアップで名前が Style から Layout に変わったそうです。

0 件のコメント:

コメントを投稿