123456789_123456789_123456789_123456789_123456789_

Module: ActionText::Attachable

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Defined in: actiontext/lib/action_text/attachable.rb

Overview

Include this module to make a record attachable to an Content.

class Person < ApplicationRecord
  include ActionText::Attachable
end

person = Person.create! name: "Javan"
html = %Q(<action-text-attachment sgid="#{person.attachable_sgid}"></action-text-attachment>)
content = ActionText::Content.new(html)
content.attachables # => [person]

Constant Summary

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

append_features, prepend_features

Instance Attribute Summary

Instance Method Summary

Class Method Details

.attachable_from_sgid(sgid) (private)

[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 50

def attachable_from_sgid(sgid)
  from_attachable_sgid(sgid)
rescue ActiveRecord::RecordNotFound
  nil
end

.from_attachable_sgid(sgid, options = {})

[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 43

def from_attachable_sgid(sgid, options = {})
  method = sgid.is_a?(Array) ? :locate_many_signed : :locate_signed
  record = GlobalID::Locator.public_send(method, sgid, options.merge(for: LOCATOR_NAME))
  record || raise(ActiveRecord::RecordNotFound)
end

.from_node(node)

Extracts the Attachable from the attachment HTML node:

person = Person.create! name: "Javan"
html = %Q(<action-text-attachment sgid="#{person.attachable_sgid}"></action-text-attachment>)
fragment = ActionText::Fragment.wrap(html)
attachment_node = fragment.find_all(ActionText::Attachment.tag_name).first
ActionText::Attachable.from_node(attachment_node) # => person
[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 31

def from_node(node)
  if attachable = attachable_from_sgid(node["sgid"])
    attachable
  elsif attachable = ActionText::Attachables::ContentAttachment.from_node(node)
    attachable
  elsif attachable = ActionText::Attachables::RemoteImage.from_node(node)
    attachable
  else
    ActionText::Attachables::MissingAttachable.new(node["sgid"])
  end
end

Instance Attribute Details

#previewable_attachable?Boolean (readonly)

[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 99

def previewable_attachable?
  false
end

Instance Method Details

#attachable_content_type

[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 83

def attachable_content_type
  try(:content_type) || "application/octet-stream"
end

#attachable_filename

[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 87

def attachable_filename
  filename.to_s if respond_to?(:filename)
end

#attachable_filesize

[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 91

def attachable_filesize
  try(:byte_size) || try(:filesize)
end

#attachable_metadata

[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 95

def 
  try(:) || {}
end

#attachable_sgid

Returns the Signed Global ID for the attachable. The purpose of the ID is set to ‘attachable’ so it can’t be reused for other purposes.

[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 79

def attachable_sgid
  to_sgid(expires_in: nil, for: LOCATOR_NAME).to_s
end

#attribute_names_for_serialization (private)

[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 144

def attribute_names_for_serialization
  super + ["attachable_sgid"]
end

#read_attribute_for_serialization(key) (private)

[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 148

def read_attribute_for_serialization(key)
  if key == "attachable_sgid"
    persisted? ? super : nil
  else
    super
  end
end

#to_attachable_partial_path

Returns the path to the partial that is used for rendering the attachable. Defaults to to_partial_path.

Override to render a different partial:

class User < ApplicationRecord
  def to_attachable_partial_path
    "users/attachable"
  end
end
[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 127

def to_attachable_partial_path
  to_partial_path
end

#to_rich_text_attributes(attributes = {})

[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 131

def to_rich_text_attributes(attributes = {})
  attributes.dup.tap do |attrs|
    attrs[:sgid] = attachable_sgid
    attrs[:content_type] = attachable_content_type
    attrs[:previewable] = true if previewable_attachable?
    attrs[:filename] = attachable_filename
    attrs[:filesize] = attachable_filesize
    attrs[:width] = [:width]
    attrs[:height] = [:height]
  end.compact
end

#to_trix_content_attachment_partial_path

Returns the path to the partial that is used for rendering the attachable in Trix. Defaults to to_partial_path.

Override to render a different partial:

class User < ApplicationRecord
  def to_trix_content_attachment_partial_path
    "users/trix_content_attachment"
  end
end
[ GitHub ]

  
# File 'actiontext/lib/action_text/attachable.rb', line 113

def to_trix_content_attachment_partial_path
  to_partial_path
end