#概要
save, updateの際に適用するvalidatesを切り替える事で、
用途や部分で分けて入れたいデータのvalidation処理等を実現します。
##基本
create
とupdate
で分けたい場合は以下のように記述します。
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