2016-05-02 18 views
6

rspecを介して多態性シリアライザを動作させ、テストすることに取り組んでいます。 0.10 +ActiveModelSerializers多態性Json

私はこのポストを見つけましたが、これは意味がありますが、ポリモーフを作成するときにシリアル化を生成するためのエントリを与えてくれます。またはテストケースに - 私はテストがさえ適切に(すなわちASSET_ID、asset_typeいずれかの多型識別子を追加するように見えるいけないことに気づいた

{: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 

)ASSET_IDを参照して、ネストされたasset_typeを期待imageable_id、ima geable_type)私はストレートMediaSerialzer.new(メディア)まで行けば

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

私は.associationsで突くことができますが、私は完全なペイロード

を生成しているかのようにそれらをレンダリングするために取得するように見えるカントドキュメント https://github.com/rails-api/active_model_serializers

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

から

イムかなり確信してイムは、行方不明の何か/何か間違ったこと - すべての指導は素晴らしいことです。

おかげ

答えて

1

あなたが探している効果を得ることは容易ではありませんが、それは可能です。

シリアライザによって生成されたハッシュには、associationsメソッドをオーバーライドしてアクセスできます。

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 

私はActiveModelSerializerについて多くのことを学びました。私は、トピックにライアン・ベイツポッドキャストに言及:そこで

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

彼はあなたがattributesメソッドをオーバーライドして、シリアライザによって生成されたハッシュへのアクセスを得るためにsuperを呼び出すことができる方法を説明します。私はあなたのポストに記載されているassociationsメソッドについて同じトリックをすることができたと推測しました。そこからすべてのキーを置き換えるのにRubyが少し必要ですが、必要なものを正しく理解していれば、技術的に可能です。

希望に役立ちます!