lib/active_storage/attached/one.rb in activestorage-5.2.0.rc1 vs lib/active_storage/attached/one.rb in activestorage-5.2.0.rc2

- old
+ new

@@ -18,14 +18,20 @@ # 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(avatar_blob) # ActiveStorage::Blob object def attach(attachable) - if attached? && dependent == :purge_later - replace attachable - else - write_attachment build_attachment_from(attachable) + blob_was = blob if attached? + blob = create_blob_from(attachable) + + unless blob == blob_was + transaction do + detach + write_attachment build_attachment(blob: blob) + end + + blob_was.purge_later if blob_was && dependent == :purge_later end end # Returns +true+ if an attachment has been made. # @@ -61,20 +67,13 @@ attachment.purge_later end end private - def replace(attachable) - blob.tap do - transaction do - detach - write_attachment build_attachment_from(attachable) - end - end.purge_later - end + delegate :transaction, to: :record - def build_attachment_from(attachable) - ActiveStorage::Attachment.new(record: record, name: name, blob: create_blob_from(attachable)) + def build_attachment(blob:) + ActiveStorage::Attachment.new(record: record, name: name, blob: blob) end def write_attachment(attachment) record.public_send("#{name}_attachment=", attachment) end