2013-06-25 29 views
0

我试图用Ruby on Rails构建JSON API端点。Ruby on Rails加入了json输出的模型

我跟着指示以下,并能为我的模型 http://railscasts.com/episodes/350-rest-api-versioning?view=comments/

创建JSON API,我有以下控制器:

/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:流派,风格belongs_to:电影

不过,我不能够使用以下方法来获得流派与电影参加对象为JSON输出:

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

我也注意到,下面的命令是能够产生红宝石控制台输出加盟

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

但随后在控制器中添加此不显示其他类型字段

有人可以帮我吗?

谢谢!

+0

我想你':joins'的说法应该是':includes'因为那实际上包含了相关的记录。 – Arjan

回答

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