同じColumn名で同じvalidationルールなのにバラバラに定義されている状態
RailsでActiveModelを書いてると同じColumn名の時同じValidationを使うのでDRYにしたいと思うことは誰しもあるでしょう。例えば次のような2つのModel Foo
, Bar
がある時です。
app/model/hoo.rb
class Foo < ActiveModel::Base
validates :column_hoge, present: true
validates :column_fuga, numericality: { only_integer: true }
validates :column_piyo, present: true
# ...
end
app/model/bar.rb
class Bar < ActiveModel::Base
validates :column_hoge, present: true
validates :column_fuga, numericality: { only_integer: true }
validates :column_toto, present: true
# ...
end
これらのモデルの column_hoge
, column_fuga
はColumn名も同一で、validationのルールも同一です。これらを一箇所で定義できたら素敵ですね。
ActiveSupport::Concern
を使って validates
を共通化する
この場合は、 ActiveSupport::Concern
でModelから共通の validates
を抜き出しましょう。
app/model/concern/hoge_fuga_validator.rb
require 'active_support'
module HogeFugaValidator
extend ActiveSupport::Concern
included do
validates :column_hoge, present: true
validates :column_fuga, numericality: { only_integer: true }
end
end
app/model/hoo.rb
class Foo < ActiveModel::Base
include HogeFugaValidator
validates :column_piyo, present: true
# ...
end
app/model/bar.rb
class Bar < ActiveModel::Base
include HogeFugaValidator
validates :column_toto, present: true
# ...
end
これで、自動的に各Modelの column_hoge
, column_fuga
がvalidationされます。