Laden von Objekten mit nicht standardmäßigen Klassennamen in EmberJS mit Rails + active_model_serializers

Ich habe ein paar Modelle in Rails, die ungefähr so ​​aussehen:

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 Serialisierern wie folgt:

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, das ungefähr so ​​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 besteht darin, dass die JSON-Objekte der von der Seite geladenen Reporter und Beauftragten von Ember nicht als Benutzerobjekte erkannt werden und der folgende Fehler angezeigt wird:

Uncaught Error: assertion failed: Your server returned a hash with the key reporters but you have no mapping for it

Ich möchte nicht entfernen

embed :ids, include: true

aus meinem IssueSerializer, da sonst die Kommentare nicht serialisiert würden.

Es gibt ein paar mögliche Möglichkeiten, dies zu lösen, über die ich nachgedacht habe:

Wenn die Einbettungsmethode für ActiveModel :: Serializer eine Liste von Modellen in der Include-Option akzeptiert, kann dies dazu führen, dass die JSON-Antwort so gefiltert wird, dass nur Kommentare von der Seite geladen werden.Das Modell von Ember Data könnte so konfiguriert werden, dass Benutzer von "Benutzern", "Reportern" und "Beauftragten" auf der Seite geladen werden. Soweit ich aus der Quelle entnehmen kann, scheint es nur einen Schlüssel für SideloadAs zu unterstützen.Ignoriere / deaktiviere irgendwie Seitenladefehler für unbekannte Schlüssel (wahrscheinlich der am wenigsten vernünftige Ansatz).

Gibt es eine andere Option, die ich hier vermisse? Möglicherweise muss ich einen Fix schreiben und eine Pull-Anfrage an Rails-API / Active_Model_Serializers, EmberJS / Data oder an beide senden.

BEARBEITEN: Meine vorübergehende Problemumgehung besteht darin, den IssueSerializer so zu ändern, dass nur die IDs für den Reporter und den Verantwortlichen serialisiert werden:

class IssueSerializer < ActiveModel::Serializer
  attributes :id, :reporter_id, :assignee_id
  embed :ids, include: true

  has_many :comments, :embed => :ids
end

Antworten auf die Frage(3)

Ihre Antwort auf die Frage