ActiveStorage File Attachment Validation

前端 未结 7 655
暖寄归人
暖寄归人 2021-01-31 10:01

Is there a way to validate attachments with ActiveStorage? For example, if I want to validate the content type or the file size?

Something like Paperclip\'s approach wou

7条回答
  •  逝去的感伤
    2021-01-31 10:32

    I found a way to validate and delete attachments with callback before_save. This is a useful approach because if you validate file during the transaction (and you want to purge it), after adding error and it will rollback deleting the attachment.

    before_save :check_logo_file, on: %i[create update]
    
    def check_favicon_content_type
        PartnerValidators::CustomPartnerFaviconValidator.new.validate(self)
    end
    
    module PartnerValidators
        class CustomPartnerFaviconValidator < ActiveModel::Validator
            ALLOWED_MIME_TYPES = %w(image/vnd.microsoft.icon image/x-icon image/png).freeze
            private_constant :ALLOWED_MIME_TYPES
    
            def validate(partner)
                if partner.favicon.attached? && invalid_content_type?(partner)
                    partner.errors.add(:favicon, I18n.t("active_admin.errors.favicon"))
                    partner.favicon.purge
                end
            end
    
            private
    
            def invalid_content_type?(partner)
                !partner.favicon.blob.content_type.in?(ALLOWED_MIME_TYPES)
            end
        end
    end
    

提交回复
热议问题