aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Claghorn <george@basecamp.com>2019-05-17 16:42:21 -0400
committerGeorge Claghorn <george@basecamp.com>2019-05-17 16:46:16 -0400
commitaa7da0471f7fcf2adbbc26c37a25914d8493928d (patch)
tree491f396ba26fcaf9b85dac3af10c5946e5fdc037
parente10f01532e801174692f56175419e5fcbcdba36f (diff)
downloadrails-aa7da0471f7fcf2adbbc26c37a25914d8493928d.tar.gz
rails-aa7da0471f7fcf2adbbc26c37a25914d8493928d.tar.bz2
rails-aa7da0471f7fcf2adbbc26c37a25914d8493928d.zip
Deduplicate ActionText::RichText embeds
Fix that an ActiveRecord::RecordNotUnique error would be raised when saving rich-text content with the same file attached multiple times.
-rw-r--r--actiontext/app/models/action_text/rich_text.rb2
-rw-r--r--actiontext/test/unit/model_test.rb9
2 files changed, 10 insertions, 1 deletions
diff --git a/actiontext/app/models/action_text/rich_text.rb b/actiontext/app/models/action_text/rich_text.rb
index 19fa3e030e..1a3ffdfa27 100644
--- a/actiontext/app/models/action_text/rich_text.rb
+++ b/actiontext/app/models/action_text/rich_text.rb
@@ -15,7 +15,7 @@ module ActionText
has_many_attached :embeds
before_save do
- self.embeds = body.attachables.grep(ActiveStorage::Blob) if body.present?
+ self.embeds = body.attachables.grep(ActiveStorage::Blob).uniq if body.present?
end
def to_plain_text
diff --git a/actiontext/test/unit/model_test.rb b/actiontext/test/unit/model_test.rb
index af53f88caa..c2c3ccaaec 100644
--- a/actiontext/test/unit/model_test.rb
+++ b/actiontext/test/unit/model_test.rb
@@ -44,6 +44,15 @@ class ActionText::ModelTest < ActiveSupport::TestCase
assert_equal [ActiveStorage::Attachment], message.content.embeds.map(&:class)
end
+ test "embed extraction deduplicates file attachments" do
+ blob = create_file_blob(filename: "racecar.jpg", content_type: "image/jpg")
+ content = ActionText::Content.new("Hello world").append_attachables([ blob, blob ])
+
+ assert_nothing_raised do
+ Message.create!(subject: "Greetings", content: content)
+ end
+ end
+
test "saving content" do
message = Message.create!(subject: "Greetings", content: "<h1>Hello world</h1>")
assert_equal "Hello world", message.content.to_plain_text