123456789_123456789_123456789_123456789_123456789_

Class: ActiveStorage::Attached::One

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Attached
Instance Chain:
self, Attached
Inherits: Attached
  • ::Object
Defined in: activestorage/lib/active_storage/attached/one.rb

Overview

=============================

Representation of a single attachment to a model.

Instance Attribute Summary

  • #attached? ⇒ Boolean readonly

    Returns true if an attachment has been made.

  • #blank? ⇒ Boolean readonly

    Returns true if an attachment is not attached.

  • #detach readonly

    Deletes the attachment without purging it, leaving its blob in place.

  • #purge readonly

    Directly purges the attachment (i.e.

  • #purge_later readonly

    Purges the attachment through the queuing system.

Instance Method Summary

Instance Attribute Details

#attached? ⇒ Boolean (readonly)

Returns true if an attachment has been made.

class User < ApplicationRecord
  has_one_attached :avatar
end

{User.new}.avatar.attached? # => false
[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/one.rb', line 99

def attached?
  attachment.present?
end

#blank? ⇒ Boolean (readonly)

Returns true if an attachment is not attached.

class User < ApplicationRecord
  has_one_attached :avatar
end

{User.new}.avatar.blank? # => true
[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/one.rb', line 48

def blank?
  !attached?
end

#detach (readonly)

Deletes the attachment without purging it, leaving its blob in place.

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/one.rb', line 27

delegate :detach, to: :detach_one

#purge (readonly)

Directly purges the attachment (i.e. destroys the blob and attachment and deletes the file on the service).

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/one.rb', line 15

delegate :purge, to: :purge_one

#purge_later (readonly)

Purges the attachment through the queuing system.

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/one.rb', line 21

delegate :purge_later, to: :purge_one

Instance Method Details

#as_json(options = nil)

Returns the attachment record's JSON representation, or nil when no attachment is present.

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/one.rb', line 54

def as_json(options = nil)
  attached? ? attachment.as_json(options) : nil
end

#attach(attachable)

Attaches an attachable to the record.

If the record is persisted and unchanged, the attachment is saved to 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/jpeg")
person.avatar.attach(avatar_blob) # {ActiveStorage::Blob} object
[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/one.rb', line 70

def attach(attachable)
  record.public_send("#{name}=", attachable)
  if record.persisted? && !record.changed?
    return if !record.save
  end
  record.public_send("#{name}")
end

#attach!(attachable)

Calls attach, and raises an exception if the record was meant to be saved but at least one of the validations failed.

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/jpeg")
person.avatar.attach!(avatar_blob) # {ActiveStorage::Blob} object
[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/one.rb', line 86

def attach!(attachable)
  attach(attachable) || raise(ActiveRecord::RecordNotSaved.new("Failed to save the record", record))
end

#attachment

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.

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/one.rb', line 35

def attachment
  change.present? ? change.attachment : record.public_send("#{name}_attachment")
end

#detach_one (private)

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/one.rb', line 108

def detach_one
  Attached::Changes::DetachOne.new(name, record, attachment)
end

#purge_one (private)

[ GitHub ]

  
# File 'activestorage/lib/active_storage/attached/one.rb', line 104

def purge_one
  Attached::Changes::PurgeOne.new(name, record, attachment)
end