class PostThumbnailUploadValidator MAX_THUMBNAIL_BYTES = 20 * 1024 * 1024 class InvalidUpload < StandardError; end def self.validate! thumbnail return if thumbnail.blank? raise InvalidUpload, 'thumbnail upload が不正です.' unless thumbnail.is_a?(ActionDispatch::Http::UploadedFile) raise InvalidUpload, 'thumbnail file size が大きすぎます.' if thumbnail.size > MAX_THUMBNAIL_BYTES attachment = Post.resized_thumbnail_attachment(thumbnail) attachment[:io].close if attachment[:io].respond_to?(:close) rescue MiniMagick::Error raise InvalidUpload, 'サムネイル画像の変換に失敗しました.' ensure thumbnail&.rewind if thumbnail.respond_to?(:rewind) end end