Skip to content

Commit 091cf53

Browse files
ef4bmac
authored andcommitted
[BUGFIX beta] Fix key remapping for embedded records
Closes #4068. This implements the same semantics for `key` that are used in JSONSerializer, for both belongsTo and hasMany embedded records. (cherry picked from commit 6091508)
1 parent 46ab1c6 commit 091cf53

File tree

2 files changed

+76
-2
lines changed

2 files changed

+76
-2
lines changed

addon/-private/serializers/embedded-records-mixin.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,11 @@ export default Ember.Mixin.create({
217217

218218
_serializeEmbeddedBelongsTo(snapshot, json, relationship) {
219219
let embeddedSnapshot = snapshot.belongsTo(relationship.key);
220-
let serializedKey = this.keyForRelationship(relationship.key, relationship.kind, 'serialize');
220+
var serializedKey = this._getMappedKey(relationship.key, snapshot.type);
221+
if (serializedKey === relationship.key && this.keyForRelationship) {
222+
serializedKey = this.keyForRelationship(relationship.key, relationship.kind, "serialize");
223+
}
224+
221225
if (!embeddedSnapshot) {
222226
json[serializedKey] = null;
223227
} else {
@@ -332,7 +336,11 @@ export default Ember.Mixin.create({
332336
},
333337

334338
_serializeEmbeddedHasMany(snapshot, json, relationship) {
335-
let serializedKey = this.keyForRelationship(relationship.key, relationship.kind, 'serialize');
339+
var serializedKey = this._getMappedKey(relationship.key, snapshot.type);
340+
if (serializedKey === relationship.key && this.keyForRelationship) {
341+
serializedKey = this.keyForRelationship(relationship.key, relationship.kind, "serialize");
342+
}
343+
336344

337345
warn(
338346
`The embedded relationship '${serializedKey}' is undefined for '${snapshot.modelName}' with id '${snapshot.id}'. Please include it in your original payload.`,

tests/integration/serializers/embedded-records-mixin-test.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2145,3 +2145,69 @@ test("serializing belongsTo correctly removes embedded foreign key", function(as
21452145
}
21462146
});
21472147
});
2148+
2149+
2150+
test("serializing embedded belongsTo respects remapped attrs key", function(assert) {
2151+
run(function() {
2152+
homePlanet = env.store.createRecord('home-planet', { name: "Hoth" });
2153+
superVillain = env.store.createRecord('super-villain', { firstName: "Ice", lastName: "Creature", homePlanet: homePlanet });
2154+
});
2155+
2156+
env.registry.register('serializer:super-villain', DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
2157+
attrs: {
2158+
homePlanet: { embedded: 'always', key: 'favorite_place' }
2159+
}
2160+
}));
2161+
2162+
var serializer = env.store.serializerFor("super-villain");
2163+
var json;
2164+
2165+
run(function() {
2166+
json = serializer.serialize(superVillain._createSnapshot());
2167+
});
2168+
2169+
assert.deepEqual(json, {
2170+
firstName: "Ice",
2171+
lastName: "Creature",
2172+
favorite_place: {
2173+
name: "Hoth"
2174+
},
2175+
secretLab: null
2176+
});
2177+
});
2178+
2179+
test("serializing embedded hasMany respects remapped attrs key", function(assert) {
2180+
run(function() {
2181+
homePlanet = env.store.createRecord('home-planet', { name: "Hoth" });
2182+
superVillain = env.store.createRecord('super-villain', { firstName: "Ice", lastName: "Creature", homePlanet: homePlanet });
2183+
});
2184+
2185+
env.registry.register('serializer:home-planet', DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
2186+
attrs: {
2187+
villains: { embedded: 'always', key: 'notable_persons' }
2188+
}
2189+
}));
2190+
2191+
env.registry.register('serializer:super-villain', DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
2192+
attrs: {
2193+
homePlanet: { serialize: false },
2194+
secretLab: { serialize: false }
2195+
}
2196+
}));
2197+
2198+
2199+
var serializer = env.store.serializerFor("home-planet");
2200+
var json;
2201+
2202+
run(function() {
2203+
json = serializer.serialize(homePlanet._createSnapshot());
2204+
});
2205+
2206+
assert.deepEqual(json, {
2207+
name: "Hoth",
2208+
notable_persons: [{
2209+
firstName: 'Ice',
2210+
lastName: 'Creature'
2211+
}]
2212+
});
2213+
});

0 commit comments

Comments
 (0)