69
59

More than 5 years have passed since last update.

Rails4でModelのvalidatesを切り替える

Posted at

概要

save, updateの際に適用するvalidatesを切り替える事で、
用途や部分で分けて入れたいデータのvalidation処理等を実現します。

基本

createupdateで分けたい場合は以下のように記述します。

model.rb
# create時に適用するvalidation
validates :username, presence: true, on: :create
model.rb
# update時に適用するvalidation
validates :username, presence: true, on: :update

上記の判定は、Railsが内部でnew_record?によるチェックをしています。

応用

場合によってvalidationを分けたい時は以下のように記述します。

controller.rb
# contextを指定
user.save(context: :hoge)
model.rb
# 指定したcontextに対応するvalidation
validates :username, presence: true, on: :hoge

また、saveではなくvalid?で確認する場合は以下のように記述します

controller.rb
# contextを指定(シンボルのみで)
user.valid?(:hoge)

UPDATEの場合

updateメソッドではcontextパラメータを指定できません。
なので、以下のような記述でsaveとして扱います。

controller.rb
# 投入するデータ
user.attributes = { email: 'test@mail.com' }
user.save(context: :hoge)

注意!!

accepts_nested_attributes_for等を使って、子モデルも一括で登録する場合、
子テーブルにはcontextが効かない!
create及びupdateは効きます

おまけ

validationパターンが多岐に渡る場合は、
以下のように記述するとグルーピングできる。

model.rb
with_options on: :hoge do |hoge|
  hoge.validates :email, presence: true
  hoge.validates :username, presence: true
end

with_options on: :fuga do |fuga|
  fuga.validates :email, presence: true
end
69
59
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
69
59