FIX: Don’t try to serialize associations in PostRevisionSerializer
Some checks are pending
Licenses / run (push) Waiting to run
Linting / run (push) Waiting to run
Tests / core frontend (${{ matrix.browser }}) (Firefox Evergreen) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (system, plugins) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (system, themes) (push) Waiting to run
Tests / core frontend (${{ matrix.browser }}) (Chrome) (push) Waiting to run
Tests / core frontend (${{ matrix.browser }}) (Firefox ESR) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (annotations, core) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (backend, core) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (backend, plugins) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (frontend, plugins) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (frontend, themes) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (system, chat) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (system, core) (push) Waiting to run

Currently, if an association is added as a tracked field in
`PostRevisor`, the `PostRevisionSerializer` class will try to serialize
it somehow. This will raise an error as ActiveRecord collection proxies
can't be serialized.

This patch addresses this issue by skipping any association tracked by
the `PostRevisor` class.
This commit is contained in:
Loïc Guitaut 2024-10-22 15:29:07 +02:00 committed by Loïc Guitaut
parent 3be925e161
commit 5177aef37d
2 changed files with 23 additions and 2 deletions

View File

@ -219,8 +219,13 @@ class PostRevisionSerializer < ApplicationSerializer
# Retrieve any `tracked_topic_fields` # Retrieve any `tracked_topic_fields`
PostRevisor.tracked_topic_fields.each_key do |field| PostRevisor.tracked_topic_fields.each_key do |field|
next if field == :tags next unless topic.respond_to?(field)
latest_modifications[field.to_s] = [topic.public_send(field)] if topic.respond_to?(field) topic
.public_send(field)
.then do |value|
next if value.try(:proxy_association)
latest_modifications[field.to_s] = [value]
end
end end
latest_modifications["featured_link"] = [ latest_modifications["featured_link"] = [

View File

@ -127,4 +127,20 @@ RSpec.describe PostRevisionSerializer do
expect(json[:tags_changes]).to_not be_present expect(json[:tags_changes]).to_not be_present
end end
end end
context "when some tracked topic fields are associations" do
let(:serializer) { described_class.new(post_revision, scope: guardian, root: false) }
let(:post_revision) { Fabricate(:post_revision, post:) }
let(:guardian) { Discourse.system_user.guardian }
before do
allow(PostRevisor).to receive(:tracked_topic_fields).and_wrap_original do |original_method|
original_method.call.merge(allowed_users: -> {}, allowed_groups: -> {})
end
end
it "skips them" do
expect { serializer.as_json }.not_to raise_error
end
end
end end