I have previously saved an object with children in multiple requests but I don’t like the fact that if one loses internet connection in the middle of the save, the client and server are out of sync unless one does a browser refresh. I’m trying to do it in 1 one request using Rail’s accepts_nested_attributes_for. The save works but Ember Data treats the children in the response as new children i.e. if an object has 1 newly created child before the save, after the save it will have 2 - the original record and the record from the response. Has anybody figured out a way around this?
Below is how I’m adding ‘_attributes’ suffix to embedded records key. I’m using Ember Data 1.0.0 beta 16.
app/serializers/application.coffee:
ApplicationSerializer = DS.ActiveModelSerializer.extend RailsEmbeddedRecordsMixin,
attrs:
childItems:
serialize: 'records'
app/serializers/rails-embedded-records-mixin.coffee:
RailsEmbeddedRecordsMixin = Ember.Mixin.create DS.EmbeddedRecordsMixin,
serializeBelongsTo: (snapshot, json, relationship) ->
attr = relationship.key
if @noSerializeOptionSpecified(attr)
@_super(snapshot, json, relationship)
return
includeIds = @hasSerializeIdsOption(attr)
includeRecords = @hasSerializeRecordsOption(attr)
embeddedSnapshot = snapshot.belongsTo(attr)
if includeIds
key = @keyForRelationship(attr, relationship.kind)
if !embeddedSnapshot
json[key] = null
else
json[key] = embeddedSnapshot.id
else if includeRecords
key = @keyForAttribute(attr) + '_attributes'
if !embeddedSnapshot
json[key] = null
else
json[key] = embeddedSnapshot.record.serialize(includeId: true)
@removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json[key])
serializeHasMany: (snapshot, json, relationship) ->
attr = relationship.key
if @noSerializeOptionSpecified(attr)
@_super(snapshot, json, relationship)
includeIds = @hasSerializeIdsOption(attr)
includeRecords = @hasSerializeRecordsOption(attr)
if includeIds
key = @keyForRelationship(attr, relationship.kind)
json[key] = snapshot.hasMany(attr, ids: true)
else if includeRecords
key = @keyForAttribute(attr) + '_attributes'
json[key] = snapshot.hasMany(attr).map (embeddedSnapshot) =>
embeddedJson = embeddedSnapshot.record.serialize(includeId: true)
@removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, embeddedJson)
return embeddedJson