LoginSignup
1
0

More than 3 years have passed since last update.

[未経験エンジニア]のオリジナルアプリ制作の反省2. 「バリデーションの適用範囲」

Posted at

今回書くこと

バリデーションを、特定の条件下のみで発動させたい場合、どのような処理を記述すればいいか

環境

Ruby 2.6.5
Ruby on Rails 6.0.4.3

結論

on: :アクションを用いる

記述方法

モデル

article_model.rb
class Article < ApplicationRecord
  validates :title, presence: true, on: :create
  validates :text, presence: true
end

titleにon: :createと記述されています。このオプションによって、このタイトルへのpresence: trueは、createアクションのみに適応されることになります。textのpresence: trueは、create, updateにかかっていることになります。

createをupdateに変えることもできます。

Rails ガイドでは

バリデーションのタイミングを変更したい場合、on: :createを指定すればレコード新規作成時にのみ検証が行われ、on: :updateを指定すればレコードの更新時にのみ検証が行われます。

とされています。

ちなみに、複数のバリデーションにまとめてオプションをつける時の記述は、このようにした方が可読性が高まるでしょう。

article_model.rb
with_options on: :create do |create|
  create.validates :title, presence: true
  create.validates :text, presence: true
end

特定のバリデーションを、特定のタイミングで起動させたい。と思っている方の参考になればと思います。

浮かんだ疑問

今回のバリデーションとしてpresence: trueを例に出しましたが、実際に利用するときは、どんなバリデーションにこのオプションをかけるといいのかなと思いました。カスタムコンテキストなども踏まえ、この辺についてもう少し掘り下げたいですね。

最後に

最後まで読んでいただいた皆様、ありがとうございます。
ソースコード、記事の書き方について「もっとこうしたほうがいいよ!」というご意見「そこどうなっているの?」というご質問など、お待ちしております。

参考文献

Active Record バリデーション
- https://railsguides.jp/active_record_validations.html
状況によってsave時に実行するバリデーションを切り替える
- https://qiita.com/kadoppe/items/061d137e6022fa099872

1
0
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
1
0