read

More videos in this practice series "Building REST APIs with Rails":


Third video in a pile of LiveCoding.tv videos, shows how to use ActiveModel Serializer to shape the output of your resources. I totally forgot how links work, so watch me flap around trying to get it working and chuckle as I flail.

Source Code


Notes

To get going, you'll need to include in your Gemfile:

gem 'active_model_serializers', '~> 0.10.0'

Install that by running bundle:

$ bundle install

Now there will be a new generator available, called resource:

$ rails g resource manufacturer name:string about:string city:string country:string manufacturer:references

$ rails g resource product name:string description:string product_type:string apv:float image_url:string references:products

These fields are taken from our API Blueprint documentation, and we already know the types.

rake db:create db:migrate

Create and generate the tables from our migrations, turning them into actual schema we can populate using the rails console:

$ rails console
manufacturer = Manufacturer.create(name: "Thatchers", about: "Pretty solid cider makers who are randomly moving their factories in the south west and going to Ireland...", city: "Dublin", country: "Ireland")

Product.create(manufacturer: manufacturer, name: 'Katies', description: "Unnecessarily strong fizzy cider that sells for the same price as normal ciders.", apv: 7.6, product_type: 'cider')

Product.create(manufacturer: manufacturer, name: 'Thatchers Dry', description: "As the name suggests this is dry, and a little tangy.", apv: 6.5, product_type: 'cider')

Go look at ./app/controllers and ./app/serializers for the rest… more notes later.

Don't forget to make ./config/initializers/serializers.rb and fill it with:

ActiveModelSerializers.config.adapter = :json_api

Then shove this in ./config/application.rb:

config.after_initialize do
  Rails.application.routes.default_url_options[:host] = ENV['HOST'] || 'localhost:3000'
end

By the time all that's done, you should have some slick JSON-API output:

{
   "data":{
      "id":"1",
      "type":"manufacturer",
      "attributes":{
         "name":"Thatchers",
         "about":"Pretty solid cider makers that are ditching their factories in the south west and going to Ireland...",
         "city":"Dublin",
         "country":"Ireland"
      },
      "relationships":{
         "products":{
            "data":[
               {
                  "id":"1",
                  "type":"product"
               }
            ]
         }
      },
      "links":{
         "self":"http://localhost:3000/manufacturers/1",
         "products":{
            "href":"/products?manufacturer=1"
         }
      }
   }
}

Cheers.

Interested in a Proper Series?

These rough videos will be replaced with a nicely recorded series, and to get updates about that, just let me know your email address.


Book Cover

Build APIs You Won't Hate

Everyone and their dog wants an API, so you should probably learn how to build them.

Buy it from LeanPub or Amazon.

Image

Phil Sturgeon

Platform Engineer @ WeWork who talks about APIs a lot. Programming Polyglot, Pragmatist, Centerist and Sarcasist. Ex-The League of Extraordinary Packages, PHP The Right Way, Ex-PHP-FIG, Ex-CodeIgniter, Ex-FuelPHP, Ex-PyroCMS.

Back to Overview