👌

rubocopのカスタムルールを利用してRailsのenumに_prefix or _suffixを強制させる

2023/05/05に公開

railsの enum機能は大変便利ですが、動的に生成されるメソッド名のわかり易さや、衝突を避けるために_prefix, _suffixオプションは必須で使いたいですよね。

参考)
https://www.changesworlds.com/blog/2017/08/how-to-use-activerecord-enum-and-how-to-avoid-duplicate-errors/

rubocopのカスタムルールを作成することで、この様な制約を簡単に実現することができます。
*rails7のsyntaxには対応していない

class RuboCop::Cop::Rails::RequireEnumAffix < RuboCop::Cop::Base
  MSG = 'Add _prefix or _suffix option.'

  def_node_matcher :enum?, <<~PATTERN
    (send nil? :enum (hash $...))
  PATTERN

  def_node_matcher :affix?, <<~PATTERN
    (pair (sym {:_prefix :_suffix}) {str true})
  PATTERN

  def on_send(node)
    enum?(node) do |pairs|
      has_affix = false
      pairs.each do |pair|
        has_affix = true if affix?(pair)
      end
      add_offense(node) unless has_affix
    end
  end
end

参考)
https://moneyforward-dev.jp/entry/2021/09/02/rubocop/
https://ybiquitous.me/blog/2021/how-to-create-custom-rule-for-rubocop

Discussion