I have a custom adapter defined as follows:
# adapters/shop-language.js
import ApplicationAdapter from './application';
import UrlTemplates from "ember-data-url-templates";
export default ApplicationAdapter.extend(UrlTemplates, {
urlTemplate: '/shops/{shopId}/languages',
findAllUrlTemplate: '/shops/{shopId}/languages',
createRecordUrlTemplate: '/shops/{shopId}/languages',
urlSegments: {
shopId: function(type, id, snapshot, query) {
console.log('query: ' + query.shop_id);
//return snapshot.belongsTo('shop', { id: true }); -> fails to call belongsTo on undefined
}
},
});
When I try to save a new shop-language
like that:
# controllers/shops/shop-languages.js
export default Controller.extend({
..
actions: {
saveLanguage(aLanguage) {
let shopLanguage = this.store.createRecord('shop-language', {
language: aLanguage,
shop: this.get('currentShop.shop')
});
shopLanguage.save().then(function() {
console.log('New language added with success');
});
}
}
});
I get the following displayed in the browser console:
query shop_id: 2
jquery.js:9600 XHR finished loading: GET "http://localhost:4200/languages".
XHR finished loading: GET "http://localhost:4200/shops/2/languages".
+++ in saveLanguage: lang: 3
Uncaught TypeError: Cannot read property 'shop_id' of undefined
at Class.shopId (shop-language.js:16)
at template.fill.name (url-templates.js:31)
at subFunction (uri-templates.js:103)
at UriTemplate.fill (uri-templates.js:391)
at Class.buildURL (url-templates.js:27)
at Class.superWrapper [as buildURL] (ember-utils.js:420)
at Class.createRecord (rest.js:697)
at _commit (-private.js:12280)
at Class.flushPendingSave (-private.js:11342)
at invoke (backburner.js:205)
It seems like I have no more query
present when I trigger saveLanguage
action.
When inspecting the values passed in to urlSegments
, here is what I have:
type = "shop-language", id = null, snapshot = null, query = {shop_id: "1"}
If I use return snapshot.belongsTo('shop', { id: true });
sa described in common urlSegments wi-ki page, it fails saying that:
Cannot read property 'belongsTo' of null
How is it possible to create a shop-language
when the models are defined as follows:
# models/shop.js
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
shopLanguages: DS.hasMany('shop-language'),
languages: DS.hasMany('language')
});
# models/shop-language.js
export default DS.Model.extend({
modifiedBy: DS.attr('string'),
shop: DS.belongsTo('shop'),
language: DS.belongsTo('language')
});
# models/language.js
export default DS.Model.extend({
tag: DS.attr('string')
});
Used JS versions:
- Ember 3.0
- ember-data-url-templates": "^0.4.0",
Thank you.