Model に散らばる validates メソッドを concern で集約する

よくある事例

validates だけで 10 行ぐらいクラスを食いつぶす

app/models/book.rb

class Book < ActiveRecord::Base
  validates_presence_of :name, :password ...
  validates_length_of :title, max ...
  validates_foo
  validates_bar
  validates_qux
  .
  .
  .
  validates_me
end

解決策 (Rails 4 以上?)

concern の module に集約する

app/models/concern/validation_book.rb

module ValidationBook
  extend ActiveSupport::Concern

  included do
    validates_presence_of :name, :password ...
    validates_length_of :title, max ...
    validates_foo
    validates_bar
    validates_qux
    .
    .
    .
    validates_me
  end
end

app/models/book.rb

class Book < ActiveRecord::Base
  include ValidationBook
end

foo!

コンポジション的思考と見られ、よりオブジェクト指向設計らしくなる

もっと早くに知っときゃよかった


thanks

Rails put validation in a module mixin?