LoginSignup
4
3

More than 5 years have passed since last update.

[Rails]ActiveModelの同一Column名の同一validationを複数Modelで共有する

Last updated at Posted at 2017-11-25

同じ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されます。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3