Skip to Content Skip to Search

Action Text Content

The ActionText::Content class wraps an HTML fragment to add support for parsing, rendering and serialization. It can be used to extract links and attachments, convert the fragment to plain text, or serialize the fragment to the database.

The ActionText::RichText record serializes the ‘body` attribute as ActionText::Content.

class Message < ActiveRecord::Base
  has_rich_text :content
end

message = Message.create!(content: "<h1>Funny times!</h1>")
body = message.content.body # => #<ActionText::Content "<div class=\"trix-conte...">
body.to_s # => "<h1>Funny times!</h1>"
body.to_plain_text # => "Funny times!"
Methods
#
A
F
G
I
L
N
R
T

Attributes

[R] fragment

Class Public methods

fragment_by_canonicalizing_content(content)

# File actiontext/lib/action_text/content.rb, line 30
def fragment_by_canonicalizing_content(content)
  fragment = ActionText::Attachment.fragment_by_canonicalizing_attachments(content)
  fragment = ActionText::AttachmentGallery.fragment_by_canonicalizing_attachment_galleries(fragment)
  fragment
end

new(content = nil, options = {})

# File actiontext/lib/action_text/content.rb, line 37
def initialize(content = nil, options = {})
  options.with_defaults! canonicalize: true

  if options[:canonicalize]
    @fragment = self.class.fragment_by_canonicalizing_content(content)
  else
    @fragment = ActionText::Fragment.wrap(content)
  end
end

Instance Public methods

==(other)

# File actiontext/lib/action_text/content.rb, line 146
def ==(other)
  if self.class == other.class
    to_html == other.to_html
  elsif other.is_a?(self.class)
    to_s == other.to_s
  end
end

append_attachables(attachables)

# File actiontext/lib/action_text/content.rb, line 90
def append_attachables(attachables)
  attachments = ActionText::Attachment.from_attachables(attachables)
  self.class.new([self.to_s.presence, *attachments].compact.join("\n"))
end

as_json(*)

# File actiontext/lib/action_text/content.rb, line 138
def as_json(*)
  to_html
end

attachables()

Extracts +ActionText::Attachable+s from the HTML fragment:

attachable = ActiveStorage::Blob.first
html = %Q(<action-text-attachment sgid="#{attachable.attachable_sgid}" caption="Captioned"></action-text-attachment>)
content = ActionText::Content.new(html)
content.attachables # => [attachable]
# File actiontext/lib/action_text/content.rb, line 84
def attachables
  @attachables ||= attachment_nodes.map do |node|
    ActionText::Attachable.from_node(node)
  end
end

attachment_galleries()

# File actiontext/lib/action_text/content.rb, line 68
def attachment_galleries
  @attachment_galleries ||= attachment_gallery_nodes.map do |node|
    attachment_gallery_for_node(node)
  end
end

attachments()

Extracts +ActionText::Attachment+s from the HTML fragment:

attachable = ActiveStorage::Blob.first
html = %Q(<action-text-attachment sgid="#{attachable.attachable_sgid}" caption="Captioned"></action-text-attachment>)
content = ActionText::Content.new(html)
content.attachments # => [#<ActionText::Attachment attachable=#<ActiveStorage::Blob...
# File actiontext/lib/action_text/content.rb, line 62
def attachments
  @attachments ||= attachment_nodes.map do |node|
    attachment_for_node(node)
  end
end

inspect()

# File actiontext/lib/action_text/content.rb, line 142
def inspect
  "#<#{self.class.name} #{to_html.truncate(25).inspect}>"
end

Extracts links from the HTML fragment:

html = '<a href="http://example.com/">Example</a>'
content = ActionText::Content.new(html)
content.links # => ["http://example.com/"]

render_attachment_galleries(&block)

# File actiontext/lib/action_text/content.rb, line 103
def render_attachment_galleries(&block)
  content = ActionText::AttachmentGallery.fragment_by_replacing_attachment_gallery_nodes(fragment) do |node|
    block.call(attachment_gallery_for_node(node))
  end
  self.class.new(content, canonicalize: false)
end

render_attachments(**options, &block)

# File actiontext/lib/action_text/content.rb, line 95
def render_attachments(**options, &block)
  content = fragment.replace(ActionText::Attachment.tag_name) do |node|
    node["content"] = sanitize_content_attachment(node["content"])
    block.call(attachment_for_node(node, **options))
  end
  self.class.new(content, canonicalize: false)
end

to_html()

# File actiontext/lib/action_text/content.rb, line 122
def to_html
  fragment.to_html
end

to_partial_path()

# File actiontext/lib/action_text/content.rb, line 130
def to_partial_path
  "action_text/contents/content"
end

to_plain_text()

Returns the content as plain text with all HTML tags removed.

content = ActionText::Content.new("<h1>Funny times!</h1>")
content.to_plain_text # => "Funny times!"
# File actiontext/lib/action_text/content.rb, line 114
def to_plain_text
  render_attachments(with_full_attributes: false, &:to_plain_text).fragment.to_plain_text
end

to_rendered_html_with_layout()

# File actiontext/lib/action_text/content.rb, line 126
def to_rendered_html_with_layout
  render layout: "action_text/contents/content", partial: to_partial_path, formats: :html, locals: { content: self }
end

to_s()

# File actiontext/lib/action_text/content.rb, line 134
def to_s
  to_rendered_html_with_layout
end

to_trix_html()

# File actiontext/lib/action_text/content.rb, line 118
def to_trix_html
  render_attachments(&:to_trix_attachment).to_html
end