lib/active_storage/attached/one.rb in activestorage-6.1.7.10 vs lib/active_storage/attached/one.rb in activestorage-7.0.0.alpha1

- old
+ new

@@ -1,20 +1,46 @@ # frozen_string_literal: true module ActiveStorage # Representation of a single attachment to a model. class Attached::One < Attached + ## + # :method: purge + # + # Directly purges the attachment (i.e. destroys the blob and + # attachment and deletes the file on the service). + delegate :purge, to: :purge_one + + ## + # :method: purge_later + # + # Purges the attachment through the queuing system. + delegate :purge_later, to: :purge_one + + ## + # :method: detach + # + # Deletes the attachment without purging it, leaving its blob in place. + delegate :detach, to: :detach_one + delegate_missing_to :attachment, allow_nil: true # Returns the associated attachment record. # # You don't have to call this method to access the attachment's methods as # they are all available at the model level. def attachment change.present? ? change.attachment : record.public_send("#{name}_attachment") end + # Returns +true+ if an attachment is not attached. + # + # class User < ApplicationRecord + # has_one_attached :avatar + # end + # + # User.new.avatar.blank? # => true def blank? !attached? end # Attaches an +attachable+ to the record. @@ -23,11 +49,11 @@ # the database immediately. Otherwise, it'll be saved to the DB when the # record is next saved. # # person.avatar.attach(params[:avatar]) # ActionDispatch::Http::UploadedFile object # person.avatar.attach(params[:signed_blob_id]) # Signed reference to blob from direct upload - # person.avatar.attach(io: File.open("/path/to/face.jpg"), filename: "face.jpg", content_type: "image/jpg") + # person.avatar.attach(io: File.open("/path/to/face.jpg"), filename: "face.jpg", content_type: "image/jpeg") # person.avatar.attach(avatar_blob) # ActiveStorage::Blob object def attach(attachable) if record.persisted? && !record.changed? record.public_send("#{name}=", attachable) record.save @@ -45,36 +71,15 @@ # User.new.avatar.attached? # => false def attached? attachment.present? end - # Deletes the attachment without purging it, leaving its blob in place. - def detach - if attached? - attachment.delete - write_attachment nil + private + def purge_one + Attached::Changes::PurgeOne.new(name, record, attachment) end - end - # Directly purges the attachment (i.e. destroys the blob and - # attachment and deletes the file on the service). - def purge - if attached? - attachment.purge - write_attachment nil - end - end - - # Purges the attachment through the queuing system. - def purge_later - if attached? - attachment.purge_later - write_attachment nil - end - end - - private - def write_attachment(attachment) - record.public_send("#{name}_attachment=", attachment) + def detach_one + Attached::Changes::DetachOne.new(name, record, attachment) end end end