rails_best_practicesメモ

Rails用の静的コード解析ツール。rails_best_practices 1.20.0で確認。

Rails Best Practicesの内容に基づくチェックを行う。ただし、サイトを見ればわかる通り、定義された時期が相当古く、完全に時代遅れとなっているものも存在する。

以下のGemをインストールする。

group :development do
  gem 'rails_best_practices'
end

bundle exec rails_best_practicesで実行すると以下のような結果が表示される。

Source Code: |=======================================================================================|
/app/app/models/user.rb:13 - remove unused methods (User#unused_method)

Please go to https://rails-bestpractices.com to see more useful Rails Best Practices.

Found 1 warnings.

bundle exec rails_best_practices -gconfig/rails_best_practices.ymlファイルが生成される。

自分の考える推奨設定

AddModelVirtualAttributeCheck: { }
AlwaysAddDbIndexCheck: { }
#CheckSaveReturnValueCheck: { }
#CheckDestroyReturnValueCheck: { }
DefaultScopeIsEvilCheck: { }
DryBundlerInCapistranoCheck: { }
#HashSyntaxCheck: { }
IsolateSeedDataCheck: { }
KeepFindersOnTheirOwnModelCheck: { }
LawOfDemeterCheck: { }
#LongLineCheck: { max_line_length: 80 }
MoveCodeIntoControllerCheck: { }
MoveCodeIntoHelperCheck: { array_count: 3 }
MoveCodeIntoModelCheck: { use_count: 2 }
MoveFinderToNamedScopeCheck: { }
MoveModelLogicIntoModelCheck: { use_count: 4 }
NeedlessDeepNestingCheck: { nested_count: 2 }
NotRescueExceptionCheck: { }
NotUseDefaultRouteCheck: { }
NotUseTimeAgoInWordsCheck: { }
OveruseRouteCustomizationsCheck: { customize_count: 3 }
# Railsがマスアサインメント脆弱性対策を施している
# ProtectMassAssignmentCheck: { }
RemoveEmptyHelpersCheck: { }
RemoveTabCheck: { }
RemoveTrailingWhitespaceCheck: { }
RemoveUnusedMethodsInControllersCheck:
  except_methods:
   - SamplesController#sample_method
RemoveUnusedMethodsInHelpersCheck:
  except_methods:
   - SamplesHelper#sample_method
RemoveUnusedMethodsInModelsCheck:
  except_methods:
   - SampleModel#sample_method
ReplaceComplexCreationWithFactoryMethodCheck: { attribute_assignment_count: 2 }
ReplaceInstanceVariableWithLocalVariableCheck: { }
RestrictAutoGeneratedRoutesCheck: { }
SimplifyRenderInControllersCheck: { }
SimplifyRenderInViewsCheck: { }
#UseBeforeFilterCheck: { customize_count: 2 }
UseModelAssociationCheck: { }
UseMultipartAlternativeAsContentTypeOfEmailCheck: { }
#UseParenthesesInMethodDefCheck: { }
UseObserverCheck: { }
UseQueryAttributeCheck: { }
UseSayWithTimeInMigrationsCheck: { }
UseScopeAccessCheck: { }
UseTurboSprocketsRails3Check: { }

設定ファイルでコメントアウトされているものはチェックされない(無論、削除しても同じ)。

RemoveUnusedMethodsInModelsCheckなどは、models.map(&:used_method)のような形でしか呼ばれていないメソッド(この場合、used_methodメソッド)も違反として警告してくるので注意が必要。

警告の一覧と簡単な説明

  • AddModelVirtualAttributeCheck
  • AlwaysAddDbIndexCheck
  • CheckSaveReturnValueCheck
  • CheckDestroyReturnValueCheck
  • DefaultScopeIsEvilCheck
  • DryBundlerInCapistranoCheck
  • HashSyntaxCheck
  • IsolateSeedDataCheck
  • KeepFindersOnTheirOwnModelCheck
  • LawOfDemeterCheck
  • LongLineCheck: { max_line_length: 80 }
  • MoveCodeIntoControllerCheck
  • MoveCodeIntoHelperCheck: { array_count: 3 }
  • MoveCodeIntoModelCheck: { use_count: 2 }
  • MoveFinderToNamedScopeCheck
  • MoveModelLogicIntoModelCheck: { use_count: 4 }
  • NeedlessDeepNestingCheck: { nested_count: 2 }
  • NotRescueExceptionCheck
  • NotUseDefaultRouteCheck
  • NotUseTimeAgoInWordsCheck
  • OveruseRouteCustomizationsCheck: { customize_count: 3 }
  • ProtectMassAssignmentCheck
    • マスアサインメント脆弱性のチェックのようだが、時代遅れなので無効化してよい。
    • そもそも、Rails 6.1でcurrent_user.update_attributes(params[:user])などを記述して実行してみたが検出されない。
  • RemoveEmptyHelpersCheck
    • 何も記述されていないヘルパーがある場合に警告する。
  • RemoveTabCheck
    • タブ文字を利用している場合に警告する。erbファイル内でも警告する。
  • RemoveTrailingWhitespaceCheck
    • 行末に余計なスペースがあると警告する。RuboCopで代替可能。
  • RemoveUnusedMethodsInControllersCheck
    • コントローラーで利用されていないメソッドがあれば警告する
    • except_methodsにはFoosController#methodの形でメソッドを指定する
  • RemoveUnusedMethodsInHelpersCheck
    • ヘルパーで利用されていないメソッドがあれば警告する
    • except_methodsにはFoosHelper#methodの形でメソッドを指定する
  • RemoveUnusedMethodsInModelsCheck
    • モデルで利用されていないメソッドがあれば警告する
    • models.map(&:used_method)のような形でしか使われていない場合も警告されるので注意
    • except_methodsにはModel#methodの形でメソッドを指定する
  • ReplaceComplexCreationWithFactoryMethodCheck: { attribute_assignment_count: 2 }
  • ReplaceInstanceVariableWithLocalVariableCheck
  • RestrictAutoGeneratedRoutesCheck
  • SimplifyRenderInControllersCheck
  • SimplifyRenderInViewsCheck
  • UseBeforeFilterCheck: { customize_count: 2 }
  • UseModelAssociationCheck
  • UseMultipartAlternativeAsContentTypeOfEmailCheck
  • UseParenthesesInMethodDefCheck
  • UseObserverCheck
  • UseQueryAttributeCheck
  • UseSayWithTimeInMigrationsCheck
  • UseScopeAccessCheck
  • UseTurboSprocketsRails3Check