みるべあのエンジニア日記

勉強したことについてTwitterとガチブログの中間くらいのスタンスで書く日記

rubocop-railsの存在を今更知った

Rubyの文法をチェックするRuboCopのgemについては知っていたのですが、
Railsの文法をチェックしてくれるrubocop-railsの存在を知りませんでした。

github.com

きっかけは 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_manyhas_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は積極的に使っていってバグを最小限に開発していきたいですよね(^^)