I have an Ember app with a login form which returns the current user in JSON format after successful login.
Using createRecord
sets the returned JSON attributes directly on the model. For instance, is_private
becomes user.is_private
, not user.get('isPrivate')
?
How do I load the user model so that the attributes are set correctly and I don't have to re-fetch it using the id?
Supposedly, the official way to do this is using adapter.load
, as described in this thread:
Loading Data
Previously, some features of the store, such as
load()
, assumed a single adapter.If you want to load data from your backend without the application asking for it (for example, through a WebSockets stream), use this API:
store.adapterForType(App.Person).load(store, App.Person, payload);
This API will also handle sideloaded and embedded data. We plan to add a more convenient version of this API in the future.
But unfortunately, it doesn't handle sideloaded data, despite what the documentation claims. I personally use something like the following, which is based on how find(ID)
is implemented:
var id = json["person"]["id"];
var store = DS.get("defaultStore");
var adapter = store.adapterForType(App.Person);
adapter.didFindRecord(store, App.Person, json, id);
var person = App.Person.find(id);
Note that this code assumes JSON in the same format that find(ID)
expects to receive from the server, as documented in the RESTAdapter guide:
{
person: {
id: 1,
is_private: false,
projects: [3]
},
projects: [
{ id: 3, name: "FooReader" }
]
}
This will apply any transformations you've configured using keyForAttributeName
(such as mapping is_private
to isPrivate
), and it will handle sideloaded records. I'm not sure if this is a best practice, but it works quite well.