ich ein paar Modelle in Rails haben, die wie folgt aussehen:Side-Laden von Objekten mit Nicht-Standard-Klassennamen in EmberJS mit Rails + active_model_serializers
class Issue < ActiveRecord::Base
belongs_to :reporter, class_name: 'User'
belongs_to :assignee, class_name: 'User'
has_many :comments
end
class User < ActiveRecord::Base
end
class Comment < ActiveRecord::Base
end
mit Serializer wie so:
class IssueSerializer < ActiveModel::Serializer
attributes :id
embed :ids, include: true
has_one :reporter, :embed => :ids
has_one :assignee, :embed => :ids
end
class UserSerializer < ActiveModel::Serializer
attributes :id, :name
end
class CommentSerializer < ActiveModel::Serializer
attributes :id, :body
end
Dies erzeugt JSON, die etwa wie folgt aussieht:
{
"issues": [
{
"id": 6,
"reporter_id": 1,
"assignee_id": 2,
"comment_ids": [
3
]
},
],
"comments": [
{
"id": 3
"body": "Great comment"
}
],
"reporters": [
{
"id": 1
"name": "Ben Burton"
}
],
"assignees": [
{
"id": 2
"name": "Jono Mallanyk"
}
]
}
das Problem ist, dass die Seite belasteter Reporter und Abtretungs JSON-Objekte werden nicht von Ember als Benutzerobjekte erkannt, und ich sehe die folgenden Fehler:
Uncaught Error: assertion failed: Your server returned a hash with the key reporters but you have no mapping for it
Ich will nicht
embed :ids, include: true
von meinem IssueSerializer entfernen, weil dann die Kommentare nicht serialisiert würden.
Es gibt einige mögliche Wege, dies zu lösen, die ich in Betracht gezogen habe:
- Wenn die einbetten Methode für ActiveModel :: Serializer eine Liste von Modellen in seiner umfassen Option akzeptiert, könnte dies die JSON-Antwort-Filter nur seitengeladene Kommentare enthalten.
- Ember Datenmodell könnte konfiguriert werden, um Benutzer von "Benutzern", "Reportern" und "Beauftragten" zu laden ... aber soweit ich von der Quelle weiß, scheint es nur einen Schlüssel für sideloadAs zu unterstützen.
- Irgendwie ignorieren/deaktivieren Side-Lade-Fehler für unbekannte Schlüssel (wahrscheinlich der am wenigsten vernünftige Ansatz).
Gibt es eine andere Option, die ich hier vermisse? Ich denke, dass ich eine Reparatur schreiben muss und eine Pull-Anfrage entweder an rails-api/active_model_serializers, emberjs/data oder an beide senden muss.
EDIT: Meine vorübergehende Lösung hierfür ist die IssueSerializer zu ändern, um nur die IDs für Reporter und Abtretungsempfänger zu serialisiert:
class IssueSerializer < ActiveModel::Serializer
attributes :id, :reporter_id, :assignee_id
embed :ids, include: true
has_many :comments, :embed => :ids
end
Können Sie Ihr Issue Model zeigen? –
Ihre Antwort unten hat es richtig gemacht. – benburton
Welche Version von Ember-Daten verwendest du? –