ActiveStorageにバリデーションを設定する方法


はじめに

Ruby on Railsにおいて、ActiveStrageは画像投稿機能を実装する際、
とてもシンプルで使いやすく、重宝しています。
ただ、バリデーションの設定がデフォルトでできないようです。
どうにかしてバリデーションの設定ができないか調べてみると、
オリジナルでファイルを作成している方々がたくさんいらっしゃり、
尊敬と憧れを抱きつつも、ズボラな自分はもっと簡単に設定する方法ないの?
と探してたどり着いた方法です。

それはactivestorage-validatorというgemを導入する方法です。

個人的に、普通にモデルに設定するバリデーションとほぼ同じやり方で設定できる点が使いやすいなと感じ、他の初学者の方にもオススメできると思い記事にした次第です。

導入から使い方を下記にまとめて見ました。

(今回はRails 6.0MySQLを使用しています。)

導入方法

まず、Gemfileに下記を記述します。

gem 'activestorage-validator'

コンソールで

% bundle install

これで導入は完了です。

使い方

ファイル添付必須

入力フォームでファイルの添付を必須にしたい時の記述方法です。
'activestorage-validator'では、presence: trueで指定できます。

配置例

class User < ApplicationRecord
  has_one_attached :avatar

  validates :avatar, presence: true, blob: { content_type: :image }
end
  • blob:と記述するのは、ActiveStorageはBlobAttachmentモデルを使うからです。
  • content_type:で添付ファイルの型を指定します。今回の例では画像なので、:imageとなります。 (オプションは:imageの他に、:audio:video:textを指定可能です。)

拡張子など、もっと細かく指定したい場合

配置例

class User < ApplicationRecord
  has_many_attached :photos
  validates :photos, presence: true, blob: { content_type: ['image/png', 'image/jpg', 'image/jpeg'], size_range: 1..5.megabytes }
end
  • 拡張子を細かく指定したい場合はcontent_type:で上記のように記述すれば、より細かく指定できます。
  • 保存できるファイルの容量を指定したい場合は、size_range:で指定します。上記だと1〜5MBのファイルのみ保存可能にしています。

終わりに

以上で現時点で私が理解している機能についての説明を終わります。
まだ試していませんが、message:を使えば表示されるエラー文の指定もできるのではないかと考えたり、まだまだ細かいバリデーションを設定できる可能はあります。
active_strage_validationsというgemも似た感じでバリデーションの設定ができるようですが、
なんとなく'activestorage-validator'の方が直感的にわかりやすかったので、個人的にはこちらを使用させていただいております。
もっと詳しく知りたい方は下記参考文献よりご確認ください。

初学者ですので、理解不足な部分があると思いますが、間違いなどあれば
ご指摘していただけると幸いです。

参考文献