SNSアプリで本文と合わせて画像も投稿できる機能を実装する際、本文の入力必須というバリデーションは画像投稿が無い場合のみ適用したい(=画像のみの投稿も可能)、という場合があると思います。
そのような時のバリデーションの書き方で少し嵌ったため、備忘録も兼ねて記載します。
前提
- 画像投稿機能はActiveStorageを使用
- 画像投稿における他のバリデーション(ファイル形式・サイズ・枚数制限)は他の方の記事で詳しい解説があるため省略
バリデーション
以下、Posts
モデルのtext
カラムにバリデーションを設定します。
app/models/post.rb
has_many_attached :images # ActiveStorageで複数画像投稿を可能にするための一文
validates :text, presence: true, unless: Proc.new {images.attached?}
unless: images.attached?
と書きたくなるのですが、バリデーションにおける条件文の引数に指定できるのはシンボル、Proc
、Array
のみのため、上記のような記述となります。
メソッドを定義してシンボルで呼び出す、というやり方も可能ですが、この程度なら一行で記述したいですね。