Rista Tech Blog

株式会社リスタの技術?ブログ

Rails Best Practices を導入して、Railsに秩序を与えました

Ristaの4人目エンジニアを募集中! iOS Android Rails

どうも!Lintおばさんこと、エンジニアの望月(@c5meru)です。
この前ブログにscss-lintについて書きましたが、あの後coffeelintも入れました。 それについてはまた別途記事にします。

そして、最近は「Rails Best Practices」というGemを導入しました。
その名の通り、Railsのベストプラクティスにのっとっているかどうか、静的解析してくれるツールです。

f:id:c5meg1012:20170804104509j:plain

入れ方はとっても簡単。

# Gemfile

source 'https://rubygems.org'

group :development, :test do
  gem 'rails_best_practices'
end

Gemfileに一行追記して、

$ bundle install

をします。

これで

$ bundle exec rails_best_practices

のコマンドで動かせるようになります。

htmlで出力するには以下のオプションを追加します。

$ bundle exec rails_best_practices -f html .

htmlで出力すると、エラーの解説ページへのリンクがついてくるので便利です。

f:id:c5meg1012:20170804104527p:plain

Rails Best Practicesでチェックする項目については、設定ファイルで管理ができます。
以下のコマンドで、Railsの/config以下に設定ファイルを生成できます。

$ bundle exec rails_best_practices -g

弊社では、RemoveUnusedMethodsIn...系のチェックと、RestrictAutoGeneratedRoutesCheckはオフにしています。
前者は使っていないメソッド、後者は使っていないルーティングを判定して削除するように警告してくれる項目ですが、誤判定が見受けられたり、バグのissueがいくつか上がっていました。
Rails Best Practices関連の記事をみると、やはりRemoveUnusedMethodsIn...系のチェックは推奨しないという意見が多かったです。
設定ファイルで以下のようにコメントアウトをすることで、チェックをオフにすることができます。

# config/rails_best_practices.yml
# 一部抜粋

# RemoveUnusedMethodsInControllersCheck: { except_methods: [] }
# RemoveUnusedMethodsInHelpersCheck: { except_methods: [] }
# RemoveUnusedMethodsInModelsCheck: { except_methods: [] }
ReplaceInstanceVariableWithLocalVariableCheck: { }
# RestrictAutoGeneratedRoutesCheck: { }

弊社だとViewからControllerにかけての改善サイクルが早めなので、例えば、うっかりpartialにインスタンス変数を書いちゃう、とかよくあるのですが、Rails Best Practicesではそんなところも見つけて警告を出してくれます。
弊社では前回のscss-lint同様、Rails Best PracticesもCIで自動実行され、エラーがあればSlack・メールで開発者に通知されるので、リリース前に気づくことが出来るようになりました。

Rails Best Practicesは、デフォルトでチェックされる項目を一通り見渡すだけでも、Law of Demete(デメテルの法則)Move model logic into the Modelなど、非常に勉強になるので、Rails始めたばかりでよくわからない…という方にも、おすすめです。