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

pockestrap

Web Programmer's memo

Rails のモデル内のメソッドをソートするRubocop Extension を作った

Rubocop、使っていますか?

RubocopはRubyコードを静的に解析して問題を指摘します。
更にauto-correct機能を使うことで、指摘した内容を自動で修正することも可能です。

今回は、そのauto-correctを使用して、Railsのモデル内のメソッドをソートするGemを作りました。

Links

What's this?

例えば、下記のようなapp/models/user.rbがあったとします。

class User < ActiveRecord::Base
  belongs_to :plan
  validate :validate_name
  after_create :after_create_1
  has_many :messages
  attr_readonly :email
  after_create :after_create_2
  belongs_to :role
  before_create :set_name
end

belongs_to などの association を示すメソッドや、before_create などの callback メソッドがごっちゃになっていて見づらいですね。
特に callback は実行される順番に揃っていてほしいものです。

この状況でrubocop --auto-correct を実行すると、app/models/user.rbが以下のように修正されます。

class User < ActiveRecord::Base
  belongs_to :plan
  belongs_to :role
  has_many :messages

  validate :validate_name
  before_create :set_name
  after_create :after_create_1
  after_create :after_create_2

  attr_readonly :email

end

メソッドが並び替えられてきれいになりましたね。

ポイントは二つです。

Installation and Usage

Rubygems として公開されているため、Gemfile に以下のように追記するか

gem 'rubocop-rails-order_model_declarative_methods'

gem コマンドを実行することでインストールすることが出来ます。

gem install rubocop-rails-order_model_declarative_methods

また、このGemを有効にしてRubocopを実行するには、以下の3つの内のどれかを実施する必要があります。

.rubocop.yml に以下を追記

require: rubocop-rails-order_model_declarative_methods

Command line 引数で指定

rubocop --require rubocop-rails-order_model_declarative_methods

Rake task に以下を追記

RuboCop::RakeTask.new do |task|
  task.requires << 'rubocop-rails-order_model_declarative_methods'
end

最後に

このようなGemを作ったと言う紹介でした。
まだまだ作ったばかりで荒削りですが、Railsでmodel内のメソッドの並び替えに迷ったことのある方は是非一度使ってみて下さい。

今回このGemを作成するにあたって、いくつかハマった点がありました。
そのため、別の記事としてRubocop Extensionの作り方をそのうちまとめようと思います。