読者です 読者をやめる 読者になる 読者になる

ネオキャリアグループ開発者ブログ

ネオキャリアグループの技術者による開発ブログ

新人ようたの冒険:コーディング規約チェックツールでプルリク村に平穏を取り戻す編

こんにちは!こんばんは!
16新卒のよう太です。

最近、某タラレバ娘を見るたび恐怖感に襲われます。

今回は RailsBestPractices についてまとめてみました。
FactoryGirlは一回休みです( ー`дー´)

f:id:Yoko_Takaki:20170228123109j:plain

コーディング規約チェックツールとは?

コーディング規約チェックツールとはその名の通り、
コーディング規約に準拠したコードであるか?」をチェックしてくれるありがたいツールです。

チーム開発の場合、コードをpushした後、開発メンバーにコードレビューをお願いすると思います。
開発や他のタスクで忙しい開発メンバーの時間を頂くのに 、
基本的な構文ミスやインデントのずれ、余計な改行などがプルリクに含まれていると、

( ゚д゚ )おるぅあ!!!!

と開発メンバー(レビュワー)の心を乱すだけでなく、プルリクでさらに時間を奪ってしまい、
なんとも申し訳ない気持ちになります。

プルリクを送る前に確認を行っても、
変更ファイルが多いと単純なミスを見逃してしまう可能性も大いにありえます。

コーディング規約チェックツールは、
コーディング規約に則って書かれていないコードに対して警告文を出すため、
プルリク前にある程度の水準を満たしたコードを作成することができます。

主要なコーディング規約チェックツール

Ruby on Railsの開発者の中で有名なコーディング規約チェックツールといえば、
rubocopではないでしょうか。

gemのダウンロード数は1300万を超えており、
少し検索しただけでもリファレンスがモリモリ出てきます。
(蛇足ですが、rubocopのロゴは格好いいです)

その他にも、

などなど、様々なコーディング規約チェックツールがあります。

今回は、Railsのコーディング規約に特化した rails_best_practicesを取り上げようと思います。

rails_best_practicesとは?

rails_best_practicesは、
Railsユーザーがベストプラクティスを投稿するサイト RailsBestPracticesをもとに作成された
Railsのコーディング規約チェックツールです。

導入方法

Gemfileにrails_best_practicesを追加し、bundle installを実行しましょう。

 gem 'rails_best_practices'

使用方法

rails_best_practicesコマンドを実行すると、
rails_best_practices内で用意されたチェック項目に従って、コードのチェックを行ってくれます。

警告が何もなければ、
下記のように"No warning found.“と表示されます。 Cool!

[vagrant@gyouza rails_5]$
[vagrant@gyouza rails_5]$ bundle exec rails_best_practices
Source Code: |===================================================================================================================================================================================================|

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

No warning found. Cool!

rails_best_practicesの警告対象の一つとして、
「使用されていない(空の)ヘルパー」があります。
rails generateコマンドで新規アプリケーションや、コントローラーを作成した場合、
ヘルパーが自動的に作成されるものの全く使用されないことがあると思います。

rails_best_practicesは、
このような使用されていないヘルパー、コントローラーに対して警告を出します。
試しに「dummy_helper.rb」を作成し、
警告が発生するようにすると…

[vagrant@gyouza rails_5]$ bundle exec rails_best_practices
Source Code: |======================================================================================================================================================================|
/vagrant/hello_gyouza/rails_5/app/helpers/dammy_helper.rb:1 - remove empty helpers

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

Found 1 warnings.
  • 警告対象ファイル
  • 該当箇所
  • 警告メッセージ

これらが表示されます!Cool!

チェック結果の出力(html)

rails_best_practicesのチェック結果は、
htmlで出力してブラウザ上でも確認できます。

bundle exec rails_best_practices -f html

上記コマンドを実行すると、
appの配下にrails_best_practices_output.htmlというhtmlファイルが作成されます。

こちらのファイルをブラウザで開いてみると、

f:id:Yoko_Takaki:20170228111250p:plain

  • 警告対象ファイル
  • 該当箇所
  • 警告メッセージ

これらが表示されます。

また、警告メッセージのリンクから、
チェック対象のRailsBestPracticesのベストプラクティスに飛ぶことができます。 Cool!

rails_best_practicesのカスタマイズ

rails_best_practicesには40個ほどのチェック項目があります。
新規アプリケーションに導入した場合、警告はほとんど出ませんが、
既存のプロジェクトにrails_best_practicesをデフォルトのまま適応すると、
おびただしい数の警告が検出される可能性があります。

状況に合わせてチェック項目の適応を変更したい場合は、
config/rails_best_practices.ymlで設定を行います。
こちらの設定ファイルは、gemをインストールしただけでは作成されないため、
rails_best_practices -gコマンドで用意する必要があります。

$ bundle exec rails_best_practices -g

上記コマンドを実行すると、
app/configの配下に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 }
ProtectMassAssignmentCheck: { }
RemoveEmptyHelpersCheck: { }
#RemoveTabCheck: { }
RemoveTrailingWhitespaceCheck: { }
RemoveUnusedMethodsInControllersCheck: { except_methods: [] }
RemoveUnusedMethodsInHelpersCheck: { except_methods: [] }
RemoveUnusedMethodsInModelsCheck: { except_methods: [] }
ReplaceComplexCreationWithFactoryMethodCheck: { attribute_assignment_count: 2 }
ReplaceInstanceVariableWithLocalVariableCheck: { }
RestrictAutoGeneratedRoutesCheck: { }
SimplifyRenderInControllersCheck: { }
SimplifyRenderInViewsCheck: { }
#UseBeforeFilterCheck: { customize_count: 2 }
UseModelAssociationCheck: { }
UseMultipartAlternativeAsContentTypeOfEmailCheck: { }
#UseParenthesesInMethodDefCheck: { }
UseObserverCheck: { }
UseQueryAttributeCheck: { }
UseSayWithTimeInMigrationsCheck: { }
UseScopeAccessCheck: { }
UseTurboSprocketsRails3Check: { }

このrails_best_practices.ymlファイルの中で、
チェック項目に対して警告を非適応にする場合はコメントアウト
適応する場合はコメントインをすると、
設定を変更できます。Cool!

チェック項目リスト

rails_best_practicesで用意されている各チェック項目の詳細は、
RailsBestPracticesでまとめられているのですが、
全て英語で書かれているため、頑張って日本語でまとめてみました。
しかし、 学生時代に再々々履修を経験したぽんこつによる和訳 であるため、
「こんなことがチェックされるのか〜」くらいの軽い気持ちで見ていただけると幸いです(๑´ڡ`๑)

▼rails_best_practices チェックリスト

チェック項目 警告内容
AddModelVirtualAttributeCheck コントローラーでattributeに手を加える場合、modelでattributeの変更を行うように警告
AlwaysAddDbIndexCheck migrationファイルで外部keyに対してindexを設定していない場合 警告
CheckSaveReturnValueCheck 戻り値を保存する際は、「save!」を使用するように警告(デフォルトでは不採用)
DefaultScopeIsEvilCheck default_scopeを使用している場合 警告
DryBundlerInCapistranoCheck bundler1.0以降を使用している場合は、require 'bundler/capistrano'を使用していないと警告
IsolateSeedDataCheck SEEDデータを分離していない場合 警告
LawOfDemeterCheck 複数のオブジェクトを経由して値を取得すると警告
LongLineCheck 1メソッドの中に、max_line_lengthで設定した以上の行数が存在する場合 警告(デフォルトでは不採用)
MoveCodeIntoControllerCheck コントローラーの中にあるべきコードがViewに存在する場合 警告
MoveCodeIntoHelperCheck ヘルパーの中にあるべきコードが、Viewに存在する場合 警告
MoveCodeIntoModelCheck モデルの中にあるべきコードが、Viewに存在する場合 警告
MoveFinderToNamedScopeCheck 複数の条件を指定してデータを検索(find)する際に、モデルでscopeメソッドを使用していないと警告
MoveModelLogicIntoModelCheck ビジネスロジックが(モデルと関連する)コントローラーに存在する場合 警告
NeedlessDeepNestingCheck nested_countで設定している値よりもネストが深い場合 警告
NotRescueExceptionCheck 例外を発生させる際は、StandardErrorのみを扱うように警告
NotUseDefaultRouteCheck RESTfulな設計を行う場合,ルーティング設定をデフォルトで行うと警告
NotUseTimeAgoInWordsCheck time_ago_in_wordsメソッドを使用している場合 警告
OveruseRouteCustomizationsCheck customize_countで設定している値よりも カスタマイズしたルートの数が多い場合 警告
ProtectMassAssignmentCheck mass assignment脆弱性対策をしていない場合 警告
RemoveEmptyHelpersCheck 使用していないHelperが存在する場合警告
RemoveTabCheck インデントが2つずつでない場合 警告(デフォルトでは不採用)
RemoveTrailingWhitespaceCheck 末尾に空白があると警告
RemoveUnusedMethodsInControllersCheck コントローラーの中で使用していないメソッドがある場合 警告
RemoveUnusedMethodsInHelpersCheck ヘルパーの中で使用していないメソッドがある場合 警告
RemoveUnusedMethodsInModelsCheck モデルの中で使用していないメソッドがある場合 警告
RestrictAutoGeneratedRoutesCheck 使用されていないルートがある場合 警告
SimplifyRenderInControllersCheck renderメソッドで省略して書ける要素が含まれている場合 警告
SimplifyRenderInViewsCheck renderメソッドで省略して書ける要素が含まれている場合 警告
UseBeforeFilterCheck customize_count で設定した値よりも多くのメソッドで同じような処理が行われていた場合 警告(デフォルトでは不採用)
UseModelAssociationCheck Associationをはらずに他のModelの属性を使用する場合 警告
UseMultipartAlternativeAsContentTypeOfEmailCheck plain_textとhtml_textに対応していない場合 警告
UseObserverCheck コールバックを使用する際、Observerを使用していないと警告
UseParenthesesInMethodDefCheck (デフォルトでは不採用)
UseQueryAttributeCheck 値のチェックを行う際 ‘モデル名.プロパティー名.nil?'のように記述すると警告
UseSayWithTimeInMigrationsCheck migrationファイルでsay_with_timeメソッドを使用していない場合 警告
UseScopeAccessCheck オブジェクトとcurrent_userを比較する際は、findメソッドを使用して、該当するuserを見つけられなかった際は404エラーを出すようにするよう警告

まとめ

rails_best_practicesを使用すると、
先人たちがまとめたBestPracticesを意識してコードを書く習慣が身につき、
プルリクのコメント欄に平和が訪れます。(おそらく)
RailsBestPracticesを読むだけでもRailsの勉強になると思いますので、
ぜひチェックしてみてください〜!

弊社について

弊社ではエンジニアの募集を行っております。
ぜひ募集記事をチェックして頂けると嬉しいです!

www.wantedly.com

www.wantedly.com