From c48083dcfe472a02bbe8f421fc1e4a777057338a Mon Sep 17 00:00:00 2001 From: Marcello Costagliola Date: Tue, 6 Oct 2026 16:02:35 +0200 Subject: [PATCH] Show a file in a message's rich text by its name, whatever its variants Showing an image's preview when its variant had already been made tied the cached message to state that changes without touching it: a variant made after the message was cached would never show. It also cost a query per embedded image, since Action Text loads the embeds without their variant records. Nothing in the app makes those variants, so the partial no longer looks at them. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bj8KnxpTf9sj2Ysa8aLAVa --- app/views/active_storage/blobs/_blob.html.erb | 13 +++---------- test/helpers/messages_helper_test.rb | 12 +++++++++--- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/app/views/active_storage/blobs/_blob.html.erb b/app/views/active_storage/blobs/_blob.html.erb index cbec938..d0d43b3 100644 --- a/app/views/active_storage/blobs/_blob.html.erb +++ b/app/views/active_storage/blobs/_blob.html.erb @@ -1,14 +1,7 @@ <%# Files are posted as a message's own attachment, which gets its preview when it's posted; the composer adds none to - the rich text. One that's there anyway shows a preview only if it was already made, rather than linking to a URL - that makes it, on any view, for as long as it fails. %> -<% preview = blob.variant(resize_to_limit: local_assigns[:in_gallery] ? [ 800, 600 ] : [ 1024, 768 ]) if blob.variable? %> -<% preview = nil unless preview&.processed? %> - -
attachment--<%= blob.filename.extension %>"> - <% if preview %> - <%= image_tag preview, alt: blob.try(:alt) %> - <% end %> - + the rich text. One that's there anyway is shown by its name, with no preview: Action Text's partial links to a URL + that makes one on view, and nothing else in the app would make it. %> +
<% if caption = blob.try(:caption) %> <%= caption %> diff --git a/test/helpers/messages_helper_test.rb b/test/helpers/messages_helper_test.rb index b49465f..976d54e 100644 --- a/test/helpers/messages_helper_test.rb +++ b/test/helpers/messages_helper_test.rb @@ -1,6 +1,8 @@ require "test_helper" class MessagesHelperTest < ActionView::TestCase + include ActiveRecord::Assertions::QueryAssertions + test "message_presentation neutralizes unsafe URI schemes in links" do message = Message.create! room: rooms(:pets), body: '', client_message_id: "0015", creator: users(:jason) @@ -26,19 +28,23 @@ class MessagesHelperTest < ActionView::TestCase end test "message_presentation shows an image in the rich text as a file, rather than making its preview on view" do - presentation = view.message_presentation(message_with_file_in_rich_text("moon.jpg", "image/jpeg")) + message = Message.with_attachment_details.find(message_with_file_in_rich_text("moon.jpg", "image/jpeg").id) + + presentation = nil + assert_no_queries_match(/active_storage_variant_records/) { presentation = view.message_presentation(message) } assert_no_match %r{/representations/}, presentation assert_match %r{moon\.jpg}, presentation end - test "message_presentation shows an image in the rich text whose preview was already made" do + test "message_presentation shows an image in the rich text as a file even when its preview was made" do message = message_with_file_in_rich_text("moon.jpg", "image/jpeg") message.body.embeds.first.blob.variant(resize_to_limit: [ 1024, 768 ]).processed presentation = view.message_presentation(message.reload) - assert_match %r{]+src="[^"]*/representations/[^"]*moon\.jpg"}, presentation + assert_no_match %r{/representations/}, presentation + assert_match %r{moon\.jpg}, presentation end test "message_presentation shows a video in the rich text as a file" do