Skip to content

Commit 1ab5cd3

Browse files
committed
Don't share data_links among inherited serializers.
1 parent 11b5255 commit 1ab5cd3

3 files changed

Lines changed: 32 additions & 1 deletion

File tree

lib/fast_jsonapi/object_serializer.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def inherited(subclass)
117117
subclass.transform_method = transform_method
118118
subclass.cache_length = cache_length
119119
subclass.race_condition_ttl = race_condition_ttl
120-
subclass.data_links = data_links
120+
subclass.data_links = data_links.dup
121121
subclass.cached = cached
122122
subclass.set_type(subclass.reflected_record_type) if subclass.reflected_record_type
123123
subclass.meta_to_serialize = meta_to_serialize

spec/lib/object_serializer_class_methods_spec.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,22 @@ def year_since_release_calculator(release_year)
355355
expect(serializable_hash[:data][:links][:url]).to eq movie.url
356356
end
357357
end
358+
359+
context 'when inheriting from a parent serializer' do
360+
before do
361+
MovieSerializer.link(:url) do |movie_object|
362+
"http://movies.com/#{movie_object.id}"
363+
end
364+
end
365+
subject(:action_serializable_hash) { ActionMovieSerializer.new(movie).serializable_hash }
366+
subject(:horror_serializable_hash) { HorrorMovieSerializer.new(movie).serializable_hash }
367+
368+
let(:url) { "http://movies.com/#{movie.id}" }
369+
370+
it 'returns the link for the correct sub-class' do
371+
expect(action_serializable_hash[:data][:links][:url]).to eq "/action-movie/#{movie.id}"
372+
end
373+
end
358374
end
359375

360376
describe '#key_transform' do

spec/shared/contexts/movie_context.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,18 @@ class MovieSerializer
181181
has_one :advertising_campaign
182182
end
183183

184+
class GenreMovieSerializer < MovieSerializer
185+
link(:something) { '/something/' }
186+
end
187+
188+
class ActionMovieSerializer < GenreMovieSerializer
189+
link(:url) { |object| "/action-movie/#{object.id}" }
190+
end
191+
192+
class HorrorMovieSerializer < GenreMovieSerializer
193+
link(:url) { |object| "/horror-movie/#{object.id}" }
194+
end
195+
184196
class MovieWithoutIdStructSerializer
185197
include FastJsonapi::ObjectSerializer
186198
attributes :name, :release_year
@@ -354,6 +366,9 @@ class MovieSerializer
354366

355367
after(:context) do
356368
classes_to_remove = %i[
369+
ActionMovieSerializer
370+
GenreMovieSerializer
371+
HorrorMovieSerializer
357372
Movie
358373
MovieSerializer
359374
Actor

0 commit comments

Comments
 (0)