0

Ich arbeite an Rails 5 api nur App.Aktives Modell Serializer funktioniert nicht, wenn ich versuche, einen Hash mehrerer Modelle über Rails zurückzugeben?

Das ist also mein Modell Serializer

class MovieSerializer < ActiveModel::Serializer 
    attributes :id ,:name,:release_year,:story,:in_theater,:poster,:score,:user_count 

    belongs_to :age_rating 
    belongs_to :company 
    has_many :category , through: :movie_category 

end 

class CelebritySerializer < ActiveModel::Serializer 
    attributes :id, :first_name, :last_name 

    has_many :movie_celebrity 

end 

class MovieCelebritySerializer < ActiveModel::Serializer 
    attributes :id,:vacancy,:title 

    belongs_to :movie 
    belongs_to :celebrity 

end 

Dies ist mein Controller

class Api::V1::MoviesController < ApplicationController 

    # GET /v1/movies/:id 
    def show 

    movie = Movie.find_by(id: params[:id]) 
    casts = MovieCelebrity.where(movie_id: params[:id],vacancy: "cast") 
    directors = MovieCelebrity.where(movie_id: params[:id],vacancy: "director") 

    render :json => {:movie => movie, :casts => casts , :directors => directors} 
    end 

end 

Also das ist, was ich habe, wenn ich eine Anfrage gemacht

{ 
    "movie": { 
    "id": 1, 
    "name": "0 The Doors of Perception", 
    "release_year": 2007, 
    "story": "Non doloribus qui et eum impedit. Rerum mollitia debitis sit nesciunt. Vero autem quae sit aliquid rerum ex fugit. Eligendi assumenda et eos. Blanditiis hic ut. Commodi quo sunt voluptatem quasi.", 
    "in_theater": false, 
    "age_rating_id": 2, 
    "company_id": 5, 
    "created_at": "2016-10-12T12:45:26.213Z", 
    "updated_at": "2016-10-12T12:45:26.213Z", 
    "release_date": "2016-01-18", 
    "poster": "'http://cdn.mos.cms.futurecdn.net/15399e7a7b11a8c2ef28511107c90c6f.jpg',", 
    "score": 0, 
    "user_count": 6950 
    }, 
    "casts": [ 
    { 
     "id": 2, 
     "vacancy": "cast", 
     "title": "Pro x", 
     "movie_id": 1, 
     "celebrity_id": 56, 
     "created_at": "2016-10-12T12:45:28.001Z", 
     "updated_at": "2016-10-12T12:45:28.001Z" 
    }, 
    { 
     "id": 3, 
     "vacancy": "cast", 
     "title": "Magneto", 
     "movie_id": 1, 
     "celebrity_id": 23, 
     "created_at": "2016-10-12T12:45:28.006Z", 
     "updated_at": "2016-10-12T12:45:28.006Z" 
    } 
    ], 
    "directors": [ 
    { 
     "id": 1, 
     "vacancy": "director", 
     "title": "", 
     "movie_id": 1, 
     "celebrity_id": 17, 
     "created_at": "2016-10-12T12:45:27.993Z", 
     "updated_at": "2016-10-12T12:45:27.993Z" 
    } 
    ] 
} 

Es wie Active scheint Modell-Serializer funktionierte nicht. Weil, wenn ich nur ein Objekt zurückgebe, funktionierte es gut so.

Wie kann ich dies behoben und die Active Model Serializer funktioniert gut mit mehreren Modellen Hash-Objekt?

Danke!

Antwort

0

Sie müssen explicit serializer wie folgt festgelegt:

render json: {movie: movie, casts: casts , directors: directors}, serializer: MovieCastDirectorSerializer 

Weil AMS nicht weiß, Serializer, die für Ihre Ebene Ruby-Objekt benötigt, die Sie hier konstruieren.

Update: Aber selbst wenn Sie dies tun, AMS wird noch nicht in der Lage sein, das serialisiert, da es nicht ActiveModel Objekt sein wird. There is an example wie damit umzugehen. Aber für mich persönlich scheint es zu viel wie ein Hack. Ich denke, Sie sollten REST nicht so früh missbrauchen und sollten Serialisierer durch tatsächliche Endpunkte trennen und Ressourcen nur verschachteln, wenn sie in der realen Struktur verschachtelt sind. Denn später, wenn Ihr Code reift, wird es wirklich schwierig zu sagen, wo Sie die Daten erhalten, die Sie auf dem Display sehen.

+0

Wie kann ich all meinen Serializer mit dem '(MovieCastDirectorSerializer)' kombinieren? – user3403614

+0

Durch die Definition eines solchen Serialisierers in der Form has_many: filme, has_many: casts, has_many: directors. –

+0

Btw, Dinge wie 'through:' haben auf AMS-Ebene keine Bedeutung. Es wird nur gesagt, dass die Sammlung in die Serialisierung übernommen werden soll, egal von wo sie zugewiesen wird. –

Verwandte Themen