0

Я работаю над Rails 5 api только приложением.Активные модели Сериализаторы не работают, когда я пытаюсь вернуть хэш нескольких моделей через Rails?

Так что это моя модель сериализатору

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 

Это мой контроллер

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 

Так это то, что я получил, когда я сделал запрос

{ 
    "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" 
    } 
    ] 
} 

Похоже, Активный модельный сериализатор не работал. Потому что, если я только вернул один объект, он работал нормально.

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 } 
    render :json => movie 

end 



{ 
    "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, 
    "poster": "'http://cdn.mos.cms.futurecdn.net/15399e7a7b11a8c2ef28511107c90c6f.jpg',", 
    "score": 0, 
    "user_count": 6950, 
    "age_rating": { 
    "id": 2, 
    "name": "PG" 
    }, 
    "company": { 
    "id": 5, 
    "name": "Gislason, Jacobs and Graham" 
    }, 
    "category": [ 
    { 
     "id": 4, 
     "name": "Biography" 
    }, 
    { 
     "id": 16, 
     "name": "Mystery" 
    } 
    ] 
} 

Как я могу исправить это и сделать сериализатор активной модели прекрасно работать с хэш-объектами с несколькими моделями?

Спасибо!

ответ

0

Вы должны установить explicit serializer так:

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

Поскольку AMS не знает, какой сериализатор необходимо для простого объекта рубина, который вы построить здесь.

Update: Но даже если вы сделаете это, AMS будет по-прежнему не в состоянии сериализовать, что, как это будет не ActiveModel объект. There is an example как справиться с этим. Но для меня лично это похоже на хак. Я думаю, что вы не должны злоупотреблять REST так рано и должны отделять сериализаторы действительными конечными точками и только ресурсы гнезда, если они вложены в реальную структуру. Поскольку позже, когда ваш код созреет, будет действительно сложно сказать, где вы получаете данные, которые вы видите на дисплее в конце концов.

+0

Как я могу объединить весь мой Сериализатор с одним '(MovieCastDirectorSerializer)'? – user3403614

+0

Определив такой сериализатор в форме has_many: movies, has_many: casts, has_many: директора. –

+0

Кстати, такие вещи, как 'through:' не имеют значения на уровне AMS. Говорят, что он собирается собирать сериализацию, независимо от того, где она назначается. –