PIYO - Tech & Life -

Railsでファイル関連のバリデーションをする

Rails gem

アップロードファイルのサイズやcontent_typeなど、制限する場合があると思います。標準のvalidatorでは足りないので、自前で書いたり、carrierwaveなんかであればuploaderに制限を書いたりします。

モデルでファイル関連のvalidatorを使えるようになるfile_validatorsというのがあるので、簡単に紹介。

GitHub - musaffa/file_validators: Adds file validators to ActiveModel.
Adds file validators to ActiveModel. Contribute to musaffa/file_validators development by creating an account on GitHub.

百聞は一見にしかずだと思うので、サンプルコードを紹介。

class Profile < ActiveRecord::Base
  validates :avatar, file_size: { less_than_or_equal_to: 100.kilobytes },
                     file_content_type: { allow: ['image/jpeg', 'image/png'] }
end

file_sizefile_content_typeといったバリデーションができるようになっています。

これによって指定のサイズ以上は受け付けないとか、変なファイルを受け付けないとかの制御ができます。

file_content_typeについては正規表現の指定も可能で、↓のように書くと画像全般を許可できそうです。

validates :avatar, file_content_type: { allow: /^image\/.*/ }

エラーメッセージのi18nにも対応しているようなので実用性はありそうだし、細々とだけどメンテもされているみたいなので使ってみても良さそうという感じです。