【问题标题】:Ruby on Rails joins models for json outputRuby on Rails 加入模型以输出 json
【发布时间】:2013-06-25 08:31:14
【问题描述】:

我正在尝试使用 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)

但是在控制器中添加这个并不会显示额外的流派字段

有人可以帮帮我吗?

谢谢!

【问题讨论】:

  • 我认为你的:joins 语句应该是:includes,因为它实际上包含了相关的记录。

标签: json api activerecord ruby-on-rails-3.2


【解决方案1】:

我的建议:选择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

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

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2015-05-05
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多