Skip to content

Commit f25071c

Browse files
committed
Fixes virtual value not being used
1 parent 059409b commit f25071c

File tree

4 files changed

+54
-2
lines changed

4 files changed

+54
-2
lines changed

lib/active_model/serializer/adapter/json_api.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def add_relationships(resource, name, serializers)
4949

5050
def add_relationship(resource, name, serializer, val=nil)
5151
resource[:relationships] ||= {}
52-
resource[:relationships][name] = { data: nil }
52+
resource[:relationships][name] = { data: val }
5353

5454
if serializer && serializer.object
5555
resource[:relationships][name][:data] = { type: serializer.type, id: serializer.id.to_s }

test/adapter/json_api/has_many_test.rb

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ def setup
3131
@post.tags = [@tag]
3232
@serializer = PostSerializer.new(@post)
3333
@adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer)
34+
35+
@virtual_value = VirtualValue.new(id: 1)
3436
end
3537

3638
def test_includes_comment_ids
@@ -115,7 +117,23 @@ def test_has_many_with_no_serializer
115117
id: "1",
116118
type: "posts",
117119
relationships: {
118-
tags: { data: nil }
120+
tags: { data: [@tag.as_json]}
121+
}
122+
}
123+
}, adapter.serializable_hash)
124+
end
125+
126+
def test_has_many_with_virtual_value
127+
serializer = VirtualValueSerializer.new(@virtual_value)
128+
adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
129+
130+
assert_equal({
131+
data: {
132+
id: "1",
133+
type: "virtual_values",
134+
relationships: {
135+
maker: {data: {id: 1}},
136+
reviews: {data: [{id: 1}, {id: 2}]}
119137
}
120138
}
121139
}, adapter.serializable_hash)

test/adapter/json_api/has_one_test.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ def setup
2525
@author.posts = []
2626
@author.roles = []
2727

28+
@virtual_value = VirtualValue.new(id: 1)
29+
2830
@serializer = AuthorSerializer.new(@author)
2931
@adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'bio,posts')
3032
end
@@ -54,6 +56,24 @@ def test_includes_linked_bio
5456

5557
assert_equal(expected, @adapter.serializable_hash[:included])
5658
end
59+
60+
def test_has_one_with_virtual_value
61+
serializer = VirtualValueSerializer.new(@virtual_value)
62+
adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
63+
64+
expected = {
65+
data: {
66+
id: "1",
67+
type: "virtual_values",
68+
relationships: {
69+
maker: {data: {id: 1}},
70+
reviews: {data: [{id: 1}, {id: 2}]}
71+
}
72+
}
73+
}
74+
75+
assert_equal(expected, adapter.serializable_hash)
76+
end
5777
end
5878
end
5979
end

test/fixtures/poro.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class ProfilePreviewSerializer < ActiveModel::Serializer
7777
Location = Class.new(Model)
7878
Place = Class.new(Model)
7979
Tag = Class.new(Model)
80+
VirtualValue = Class.new(Model)
8081
Comment = Class.new(Model) do
8182
# Uses a custom non-time-based cache key
8283
def cache_key
@@ -231,6 +232,19 @@ def self.root_name
231232
has_many :tags
232233
end
233234

235+
VirtualValueSerializer = Class.new(ActiveModel::Serializer) do
236+
attributes :id
237+
238+
has_many :reviews, virtual_value: [{id: 1}, {id: 2}]
239+
has_one :maker, virtual_value: {id: 1}
240+
241+
def reviews
242+
end
243+
244+
def maker
245+
end
246+
end
247+
234248
Spam::UnrelatedLinkSerializer = Class.new(ActiveModel::Serializer) do
235249
attributes :id
236250
end

0 commit comments

Comments
 (0)