2016-05-02 15 views
6

Wrestling mit dem Versuch, polymorphe Serialisierer arbeiten und testen Daten über RSPEC. Just upgrade to 0.10 +ActiveModelSerializers Polymorphe JSON

Ich fand diesen Beitrag, der viel Sinn macht, und gibt mir einen Eintrag in die Generierung der Serialisierungen, aber wenn ich es für Polymorphe mache, bekomme ich nie den Typ und die ID richtig benannt (erwartet ASSET_ID zu sehen und verschachtelte)

{:id=>1, 
    :label=>"Today I feel amazing!", 
    :position=>0, 
    :status=>"active", 
    :media_container_id=>1, 
    :asset=> 
    {:id=>4 

Test ActiveModel::Serializer classes with Rspec

class MediaSerializer < ApplicationSerializer 
    attributes :id, 
      :label, 

    has_one :asset, polymorphic: true 
end 

ich bemerkte ASSET_TYPE, dass die Tests scheinen nicht sogar richtig die polymorphen Kennungen hinzuzufügen entweder (dh ASSET_ID, ASSET_TYPE - oder im Testfall bildbare_id, ima geable_type)

https://github.com/rails-api/active_model_serializers/commit/045fa9bc072a04f5a94d23f3d955e49bdaba74a1#diff-c3565d7d6d40da1b2bf75e13eb8e6afbR36

Wenn ich gerade nach oben MediaSerialzer.new (Medien gehen) ich an dem .associations stecken kann, aber ich kann nicht scheinen, um sie zu machen zu bekommen, als ob ich eine volle Nutzlast Erzeugung

Aus der Dokumentation https://github.com/rails-api/active_model_serializers

serializer_options = {} 
serializer = SomeSerializer.new(resource, serializer_options) 
serializer.attributes 
serializer.associations 

Im ziemlich sicher Im fehlt etwas/etwas falsch machen - eine Anleitung wäre toll.

Dank

Antwort

1

Es ist nicht einfach, die Wirkung Sie suchen, zu bekommen, aber es ist möglich.

Sie können auf den vom Serializer generierten Hash zugreifen, indem Sie die Methode associations überschreiben.

class MediaSerializer < ApplicationSerializer 
    attributes :id, 
      :label, 

    has_one :asset, polymorphic: true 

    def associations details 
    data = super 
    data[:asset] = relabel_asset(data[:asset]) 
    data 
    end 

    def relabel_asset asset 
    labelled_asset = {} 
    asset.keys.each do |k| 
     labelled_asset["asset_#{k}"] = asset[k]; 
    end 
    labelled_asset 
    end 
end 

Ich habe viel über ActiveModelSerializer gelernt, um den Dreh raus zu bekommen! Ich bezog mich auf Ryan Bates' Podcast zum Thema:

http://railscasts.com/episodes/409-active-model-serializers

Dort beschreibt er, wie Sie die attributes Methode außer Kraft setzen können und rufen super Zugriff auf die Hash vom Serializer generiert zu bekommen. Ich vermutete, dass ich den gleichen Trick für die in Ihrem Beitrag erwähnte Methode associations machen könnte. Von dort braucht es ein bisschen Ruby, um alle Schlüssel zu ersetzen, aber wenn ich richtig verstanden habe, was Sie benötigen, ist es technisch möglich.

Hoffe, dass hilft!