Więc znalazłem this pull request na github. To 8 miesięcy, więc nie będzie działać z powodu dodanego złożoność od tego czasu, ale już wdrożone obejście zaproponował tak:
App.store = DS.Store.create({
revision: 4,
adapter: DS.RESTAdapter.create({
plurals: {
'cart': 'cart'
}
})
});
App.Cart.reopenClass({
find: function() {
this._super("singleton");
}
});
na mój serwer (używam szyn), muszę dodać następujące moich trasach:
get "cart/:ignored" => "carts#show"
Wtedy muszę dodać następujące CartSerializer
(używając active_model_serializers gem):
attributes :id
def id
"singleton"
end
jest to konieczne, ponieważ, jak widać, jeśli id w odpowiedzi json nie pasuje do ID żądanego z find() (singleton
w tym przypadku), wtedy ember nie załaduje danych do modelu.
To oczywiście nie jest idealne rozwiązanie, ale dopóki dane ember nie dodadzą mu wsparcia, wydaje się, że to najmniej bolesna droga.
Przy okazji złożyłem an issue, aby dodać obsługę.
Zastępowanie funkcji buildURL będzie miało zastosowanie do wszystkich modeli, prawda? A co z moimi nietypowymi modelami? Ponadto, nawet jeśli zmienię liczbę mnogą, 'find()' (bez argumentów) oczekuje tablicy obiektów, więc to nie zadziała. I jeśli przekażę fałszywy identyfikator do znalezienia, to muszę zmodyfikować moje trasy serwera, aby zaakceptować argument id ('/ cart /: fake_id') tylko po to, aby całkowicie go zignorować. Wydaje się po prostu zbyt zjadliwe na coś tak powszechnego i prostego. –
URL kompilacji może zrobić coś takiego: '' if (record.get ('singularResouce') {...} else {this._super.apply (this, arguments);} ''. (...) może być twoją osobliwą funkcją budowania adresu URL, a twoje pojedyncze modele będą miały '' DS.Model.extend ({singularResouce: true}) ''. – Ryan
Możesz nawet zrobić coś snazzy, jak wywołanie '' buildUrl'', ale przekazać undefined jako id. – Ryan