Using Active Model Serializers

Boy, this one is late. I blame moving. Hilary and I finally got the keys to our new place and have started moving in. Last time I wrote about programming, I discussed APIs. In this post, I want to continue in the same theme and discuss implementing an API in a Rails application.

Rails has a great, simple way to output standard JSON instead of an HTML document.

class FlashcardsController < ApplicationController
  def index
    render json: Deck.all
  end
end

That block of code would output all of the Decks in the database as a JSON object. The problem is that it doesn't give you much control over it. What if you had a relation where each deck has_many: cards? That controller wouldn't give you any indication about it. That's where a handy gem called active_model_serializers comes in. Active model serializers gives you very fine control over what is output in JSON.

The way it works is you create a file in the serializers directory for each model. Then you can define exactly which attributes are output as JSON as well as how they're output. This is what a simple AMS looks like for a model Deck(id: number, title:string, public: boolean, card_id: number).

class DeckSerializer < ActiveModel::Serializer
  embed :ids
  attributes :id, :title

  has_many :cards
end

The attribute line specifies which parts of the model to expose in your API. The has_many line tells AMS to expose that there decks and cards are related. The neat part of this is the embed :ids line. Taking that line out AMS will include the cards that are associated with the deck in the JSON response. With that line in, AMS will simply give you the ids instead of the whole card object.

I love using AMS for creating JSON responses. Next week I'll combine what I talked about APIs with AMS and Grape.

Show Comments

Get the latest posts delivered right to your inbox.