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

我需要将其与电影 has_many :genres 和 Genre belongs_to :movie 的类型对象结合起来

但是,我无法使用以下内容将流派与电影对象加入 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

应用程序/序列化器/movie_serializer.rb

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

  attributes :id, :name
  has_many :genres
end

应用程序/序列化程序/genre_serializer.rb

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

  attributes :id, :name
end

active_model_serializers查看 https://github.com/rails-api/active_model_serializers的完整文档

于 2013-06-25T19:39:55.863 回答