rubocop-railsの存在を今更知った
Rubyの文法をチェックするRuboCopのgemについては知っていたのですが、
Railsの文法をチェックしてくれるrubocop-railsの存在を知りませんでした。
きっかけは noopener
リンクを別タブ/ウィンドウで開かせたい場合にHTMLのタグのrel属性に、
noopener
を付けないとセキュリティ面でリスクがあるということは以前から知っていました。
ただ、実装中にうっかり付け忘れることもあるかもしれないので、
Lintでチェックしてくれるとありがたいと思い、RuboCopのドキュメントで「link_to」と検索してヒットしたのが、こちらのページでした。
なるほどなるほど、rubocop.yml(RuboCopの設定ファイル)に
Rails/LinkToBlank: Enabled: true
と書けばいいのね💡
ということで追記してチェックを走らせたところ、Rails/LinkToBlank
なんてねぇよ!
って怒られちゃいました。。。😢
おかしいと思ってさらに調べたら、rubocop-railsというgemがあることに気が付いたわけです。
導入したらやはり便利だった
早速rubocop-railsをインストールしてチェックを走らせてみたところ、いろいろ指摘していただきました。
特に良かった指摘だけ書いておきます。
Rails/HasManyOrHasOneDependent
Rails/HasManyOrHasOneDependentは、モデル間の関連付けにおいて、 has_many
と has_one
を使った場合は dependent
オプションを付けなさいという指摘です。
データの整合性を保つために大変重要なオプションなので、指摘してくれるのはありがたいですね。
# Bad👎 class User < ApplicationRecord has_one :user_profile end # Good👍 class User < ApplicationRecord has_one :user_profile, dependent: :destroy end
Rails/UniqueValidationWithoutIndex
Rails/UniqueValidationWithoutIndexは、モデルにユニーク制約を付けている項目が、その項目のカラムにインデックスを付けるべきという指摘です。
例えばUserRoleモデルにnameカラムがあり、ユニーク制約を付けているとします。
class UserRole < ApplicationRecord validates :name, presence: true, uniqueness: true end
この場合に、user_rolesテーブルを作成するマイグレーションファイルにインデックスが付いていない場合は指摘されます。
# Bad👎 class CreateUserRoles < ActiveRecord::Migration[6.0] def change create_table :user_roles, comment: 'ユーザーの役割' do |t| t.integer :name, null: false, comment: '役割名' t.timestamps end end end # Good👍 class CreateUserRoles < ActiveRecord::Migration[6.0] def change create_table :user_roles, comment: 'ユーザーの役割' do |t| t.integer :name, null: false, index: { unique: true }, comment: '役割名' t.timestamps end end end
おわりに
個人開発の場合はレビューしてくれる人がいないので、こういったLinterは積極的に使っていってバグを最小限に開発していきたいですよね(^^)