0

Ruby on Rails で JSON API エンドポイントを構築しようとしています。

次の指示に従い、モデル用の JSON API を作成できました http://railscasts.com/episodes/350-rest-api-versioning?view=comments/

私は次のコントローラーを持っています:

/api/v1/movies_controller.rb

class MoviesController < ApplicationController
  def index
    if params[:p].nil?
      p = 1
    else
      p = params[:p].to_i
    end

    @movies = Movie.order("id DESC").page(p)
  end

  def show
    @movie = Movie.find(params[:id])
  end
end

これを、Movie has_many :genres、および Genre belongs_to :movie の Genre オブジェクトと結合する必要があります。

ただし、JSON 出力の映画オブジェクトに結合されたジャンルを取得するために次を使用することはできません。

@movie = Movie.find(params[:id], :joins => :genres)

次のコマンドが結合された出力を Ruby コンソールで生成できることに気付きました

@movie.to_json(:include=>:genres)

ただし、これをコントローラーに追加しても、追加のジャンルフィールドは表示されません

誰か助けてくれませんか?

ありがとう!

4

1 に答える 1

0

私のアドバイス:一緒に行くactive_model_serializers

次の行を Gemfile に追加します

gem 'active_model_serializers'

bundle install後で行う。

その後、

rails g serializer movie
rails g serializer genre

次のコードをカスタマイズするよりも:

/api/v1/movies_controller.rb

class MoviesController < ApplicationController
  respond_to :json

  def index
    if params[:p].nil?
      p = 1
    else
      p = params[:p].to_i
    end

    @movies = Movie.order("id DESC").page(p)

    respond_with @movies
  end

  def show
    @movie = Movie.find(params[:id])

    respond_with @movie
  end
end

app/serializers/movie_serializer.rb

class MovieSerializer < ActiveModel::Serializer
  embed :ids, :include => true

  attributes :id, :name
  has_many :genres
end

app/serializers/genre_serializer.rb

class GenreSerializer < ActiveModel::Serializer
  embed :ids, :include => true

  attributes :id, :name
end

https://github.com/rails-api/active_model_serializersの完全なドキュメントをactive_model_serializersご覧 ください。

于 2013-06-25T19:39:55.863 に答える