RuboCop Rails 2.4.0 リリース解説

RuboCop 2.4 系の最初のリリースとなる 2.4.0 をリリースしたので、概要をざっくり記しておきます。

github.com

Rails 部署に新たに追加された cop は以下の4つ。

Rails/ApplicationController cop

Rails/ApplicationRecord の Controller 版。

# bad
class MyController < ActionController::Base
end

# good
class MyController < ApplicationController
end

Rails/ApplicationMailer cop

Rails/ApplicationRecord の Mailer 版。ApplicationMailer クラス層が導入された Rails 5.0 以上のアプリケーションが検査対象となる。

# bad
class MyMailer < ActionMailer::Base
end

# good
class MyMailer < ApplicationMailer
end

Rails/RakeEnvironment cop

Rails アプリケーションにおける Rake ファイルのタスク定義で :environment タスクに依存しているか検査する。

# bad
task :foo do
end

# good
task foo: :environment do
end

:environment タスクへの依存を失念するというケースがなるほどの一方で、振る舞いを変える可能性があるため auto-correct はデフォルトで unsafe としている。

Rails/SafeNavigationWithBlank cop

以下について検査する cop で少し説明が必要なので後述。

# bad
do_something if foo&.blank?
do_something unless foo&.blank?

# good
do_something if foo.blank?
do_something unless foo.blank?

これは以下のようにレシーバーが nil の場合に safe navigation operator で blank? メソッドを呼び出した結果 falsy になるので、意図に反している可能性を示唆する cop となる。

nil.blank? #=> true
nil&.blank? #=> nil

そのため auto-correct はデフォルトで unsafe としている。

Rails/UnknownEnv の拡張

Rails/UnknownEnv について以下のケースも検知するようになった。

 # bad
 Rails.env.proudction?
+Rails.env == 'proudction'

 # good
- Rails.env.production?
+ Rails.env == 'production'

Rails/FilePath cop のデフォルトスタイル変更

このリリースでの大きな変更として Rails/FilePath のデフォルトの EnforcedStyle の変更がある。これまでの badgood が反転してデフォルトの EnforcedStyle: slashes では以下のようになる。

# bad
Rails.root.join('app', 'models', 'goober')
File.join(Rails.root, 'app/models/goober')
"#{Rails.root}/app/models/goober"

# good
Rails.root.join('app/models/goober')

もともと Windows 環境でのファイルパスセパレータとの互換を考慮して配列引数で渡しましょうといった流れだったようだが、Rails.root の戻り値となる Pathname オブジェクトはファイルパスセパレータに対する環境差異を吸収してくれているので、文字列引数で問題がなかった。また、生成する文字列の数も減らせそう、かつ、引数はひとつで固定されるなどの理由からデフォルトを変更した。これは Rails/OSS パッチ会で松田さんからデフォルト変更の提案があったことがきっかけになっている。

もし従来のスタイルの方が好ましい場合は EnforcedStyle: arguments を指定してください。

その他に Rails/ReversibleMigration, Rails/EnumHash, Rails/Presence, Rails/SaveBang といった cop へのバグ修正が含まれています。

エンジョイ!