Search code examples
ruby-on-railsapiactive-model-serializers

Rails Active Model Serializers - JSON Api


I am using AMS version 0.10 and looking to use the json-api specification for rendering my responses. However, I am having difficultly rendering the 'included' key for my relationship data. I have the following setup:

products_controller.rb

class Api::V1::ProductsController < ApplicationController
...
respond_to :json

def show
  respond_with Product.find(params[:id])
end
...

product_serializer.rb

class ProductSerializer < ActiveModel::Serializer
  attributes :id, :title, :price, :published
  has_one :user  
end

user_serializer.rb

class UserSerializer < ActiveModel::Serializer
  attributes :id, :email, :auth_token, :created_at, :updated_at
end

products_controller_spec.rb

before(:each) do      
  @product = FactoryGirl.create :product
  get :show, params: { id: @product.id }
end  
...
it "has the user as a embeded object" do
  product_response = json_response
  puts "&&&&&&&&&&&&&&&"
  puts product_response #output below

  #expect(product_response[:user][:email]).to eql @product.user.email
end
...

json_response

{:data=>{:id=>"1", :type=>"products", :attributes=>{..working..}, :relationships=>{:user=>{:data=>{:id=>"1", :type=>"users"}}}}}

I would like to know how to get the 'included' section for the nested resource.

Example (from http://jsonapi.org/format/#introduction)

{
"data": [{
"type": "articles",
"id": "1",
"attributes": {
  "title": "JSON API paints my bikeshed!"
},
"links": {
  "self": "http://example.com/articles/1"
},
"relationships": {
  "author": {
    "links": {
      "self": "http://example.com/articles/1/relationships/author",
      "related": "http://example.com/articles/1/author"
    },
    "data": { "type": "people", "id": "9" }
  }
}],
"included": [{
  "type": "people",
  "id": "9",
  "attributes": {
    "first-name": "Dan",
    "last-name": "Gebhardt",
    "twitter": "dgeb"
  },
  "links": {
    "self": "http://example.com/people/9"
   }
},

I have never used AMS before so any help will be greatly appreciated.

Many thanks


Solution

  • Just for anyone else the solution is here https://github.com/rails-api/active_model_serializers/blob/master/docs/jsonapi/schema.md.

    Essentially i add the following to my controller action (GET products/1)

    render json: product, include: params[:include]
    

    This will allow the requesting system to determine whether they would like to include the nested models by adding the parameter include='user' for the api to process.

    Thanks