When running the following from the UserController
on Google Chrome, with ember-couchdb-kit-0.9
, Ember Data v1.0.0-beta.3-56-g8367aa5
, Ember v1.0.0
, and this couchdb adapter:
customerSignUp: function () { var model = this.get('model'); var customer = this.get('store').createRecord('customer', { description: 'Why hello sir', user: model }); customer.save().then(function() { model.set('customer', customer); model.save(); }); }
with these models:
App.User = App.Person.extend({ name: DS.attr('string'), customer: DS.belongsTo('customer', {async: true }) App.Customer = DS.Model.extend({ user: DS.belongsTo('user', {async: true}), description: DS.attr('string') });
neither the user nor the customer has their relationship set properly (in the Ember Debugger the user has null
and the customer has <computed>
, rather than some sort of <EmberPromiseObject>
which is what they have when it works). This only happens when the object in question is persisted. If the save()
calls are omitted, both have correctly set relationships, but of course the database hasn't been updated with this information. Whenever the saves happen, the relationships are overwritten with empty entries.
I found that the problem was in the adapter's serializeBelongsTo
function, which I've now changed my copy to the following:
serializeBelongsTo: function(record, json, relationship) { console.log("serializeBelongsTo"); console.log(record.get('user')); console.log(json); console.log(relationship); var attribute, belongsTo, key; attribute = relationship.options.attribute || "id"; console.log(attribute); key = relationship.key; console.log(key); belongsTo = Ember.get(record, key); console.log(belongsTo); if (Ember.isNone(belongsTo)) { return; } json[key] = Ember.get(belongsTo, attribute); console.log(Ember.get(belongsTo, attribute)); console.log(json); if (relationship.options.polymorphic) { return json[key + "_type"] = belongsTo.constructor.typeKey; } else { return json; } }
attribute
, belongsTo
, and key
all log as correct, but console.log(Ember.get(belongsTo, attribute));
returns undefined
, which I've tried to change to console.log(Ember.get(Ember.get(belongsTo, 'content'), attribute));
since console.log(belongsTo);
told me the id
attribute was hidden inside a content
object. Attached is a screenshot showing what I mean. The change doesn't fix the problem though, and I keep getting
undefined
. No matter what method I use to try to get the id out of the belongsTo
object, I always get either null
or undefined
. Here are some examples of things I've tried to get content
out of the object:
var content = belongsTo.content; var content = Ember.get(belongsTo, 'content'); var content = belongsTo.get('content');
console.log(json);
returns Object {description: "Why hello sir", user: undefined}
Here's a pastebin showing relevant output: http://pastebin.com/v4mb3PJ2
Update
A very confusing update!
When I save the model from a different function:
saveModel: function() { this.get('model').save().then( function( data, textStatus, jqXHR ) { console.log('Saved successfully.'); }, function( jqXHR, textStatus, errorThrown ) { console.log(jqXHR); console.log(errorThrown); console.log(textStatus); } ); }
The model is correctly saved. Everything in serializeBelongsto
works exactly as expected.
Here's a different pastebin showing output for this case: http://pastebin.com/Vawur8Q0