Since Active Storage does not have default validation, it records the time when you set the validation by yourself as a memorandum.
・ Ruby '2.5.7' ・ Rails '5.2.3'
Execute the following command to install Active Storage.
$ rails active_storage:install
A migration file is created that creates the following two tables. ・ Active_storage_attachments ・ Active_storage_blobs
Rails db: migrate to create the table.
$ rails db:migrate
We will associate it with the model. Here, it is assumed that multiple profile images are set in the User model.
models/user.rb
class User < ApplicationRecord
has_many_attached :avatars
end
: avatars
is the name of the file, and you can specify whatever you like, such as : photos
, : images
, etc. according to the purpose of the file. There is no need to provide columns for images in the User model.
We will set the validation for the User model. Here, we will make the following three settings.
・ Avatar_type Specify the file format that can be uploaded.
・ Avatar_size Specify the size (capacity) of one file that can be uploaded.
・ Avatar_length Specify the number of files that can be uploaded.
models/user.rb
class User < ApplicationRecord
(abridgement)
validate :avatar_type, :avatar_size, :avatar_length
private
def avatar_type
avatars.each do |avatar|
if !avatar.blob.content_type.in?(%('image/jpeg image/png'))
avatar.purge
errors.add(:avatars, 'Please upload in jpeg or png format')
end
end
end
def avatar_size
avatars.each do |avatar|
if avatar.blob.byte_size > 5.megabytes
avatar.purge
errors.add(:avatars, "Must be within 5MB per file")
end
end
end
def avatar_length
if avatars.length > 4
avatars.purge
errors.add(:avatars, "Please keep within 4 sheets")
end
end
end
By the way, I am deleting temporary data with `ʻavatars.purge``. If a validation error occurs in other input items, the uploaded file will be saved in the storage when it is assigned to the attribute of the model instance in Rails 5.2 to 6.0 series or earlier, and as a result, it will be in the blob. This is because temporary data for errors may accumulate. (However, there was a change in the function of Active Storage in the update to Rails 6.0, and after the save method was executed, it was changed to the specification to be saved in the storage, so it is unnecessary if it is 6.0 or later)
Now you have the following validation settings!
Consider whether Active Storage can be used as a substitute for Carrier Wave Implement image upload function using Rails5 Active Storage
Recommended Posts