{"id":24660,"date":"2019-08-08T12:15:47","date_gmt":"2019-08-08T09:15:47","guid":{"rendered":"https:\/\/www.webcodegeeks.com\/?p=24660"},"modified":"2019-08-07T12:22:01","modified_gmt":"2019-08-07T09:22:01","slug":"power-strong-apis-json-postgres-database","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/","title":{"rendered":"Ruby on Rails Developer Series: Power of Strong APIs using JSON and Postgres Database"},"content":{"rendered":"\n<p>Welcome to the second of four Ruby on Rails Developer Series. In this series, the goal is to outline how to strengthen your API with Postgres, how to dockerize your project and add security layers to mitigate attacks to your application. In this article, we\u2019ll cycle through strengthening our API-based application that uses the JSON API from Active Model Serializer. Then we\u2019ll take advantage of JSON API features.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Let\u2019s Begin<\/h2>\n\n\n\n<p>The goal of the project has shifted and we\u2019re now advancing our basic CRUD application into an application that allows for a user to have a to-do list. We need to be able to support showing todo cards in our iOS application \u2013 10 cards at a time specifically. So in this project, we will use paging techniques to optimize the way we fetch JSON data.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Let\u2019s start by creating an Exception Handler to include in our Application Base Controller.<\/h3>\n\n\n\n<p>This will help us take care of any record issues we may face and catch\/output the response back to the application requesting data.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">app\/controllers\/concerns\/exception_handler.rb<\/h2>\n\n\n\n<div>\n<div id=\"highlighter_52325\" class=\"syntaxhighlighter  php\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"php plain\">module ExceptionHandler<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">extend ActiveSupport::Concern<\/code><\/div>\n<div class=\"line number3 index2 alt2\">&nbsp;<\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">included <\/code><code class=\"php keyword\">do<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">rescue_from ActiveRecord::RecordNotFound <\/code><code class=\"php keyword\">do<\/code> <code class=\"php plain\">|e|<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">render json: { message: e.message }, status: 404<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php functions\">end<\/code><\/div>\n<div class=\"line number8 index7 alt1\">&nbsp;<\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">rescue_from ActiveRecord::RecordInvalid <\/code><code class=\"php keyword\">do<\/code> <code class=\"php plain\">|e|<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">render json: { message: e.message }, status: 422<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php functions\">end<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php functions\">end<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"php functions\">end<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Now we can remove: <code>Line 2 - rescue_from ActiveRecord::RecordNotFound, with: :record_not_found<\/code> and the method <code>record_not_found<\/code> from our Users Controller.<\/p>\n\n\n\n<p>We will also want to include our Exception Handler Concern in our Base Controller.<\/p>\n\n\n\n<div>\n<div id=\"highlighter_996415\" class=\"syntaxhighlighter  php\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"php keyword\">class<\/code> <code class=\"php plain\">ApplicationController &lt; ActionController::Base<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">protect_from_forgery with: :exception<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php keyword\">include<\/code> <code class=\"php plain\">ExceptionHandler<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"php functions\">end<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Now that we have stronger exception handlers for our controllers, we can focus on the models we need to create in order to achieve our project requirements.<\/p>\n\n\n\n<p>The way our logic is going to flow:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" width=\"968\" height=\"402\" src=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2019\/08\/0aceec4b2be0f98287bfeb2a6dce0131.png\" alt=\"\" class=\"wp-image-24668\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2019\/08\/0aceec4b2be0f98287bfeb2a6dce0131.png 968w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2019\/08\/0aceec4b2be0f98287bfeb2a6dce0131-300x125.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2019\/08\/0aceec4b2be0f98287bfeb2a6dce0131-768x319.png 768w\" sizes=\"(max-width: 968px) 100vw, 968px\" \/><\/figure><\/div>\n\n\n\n<p>Let\u2019s begin to generate the models:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_871516\" class=\"syntaxhighlighter  php\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"php plain\">rails g model Todo name:string slug:string priority:string completed:boolean user_id:integer <\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">invoke&nbsp; active_record<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">create&nbsp;&nbsp;&nbsp; db\/migrate\/20190615221743_create_todos.rb<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">create&nbsp;&nbsp;&nbsp; app\/models\/todo.rb<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">invoke&nbsp;&nbsp;&nbsp; test_unit<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">create&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test\/models\/todo_test.rb<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">create&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test\/fixtures\/todos.yml<\/code><\/div>\n<div class=\"line number8 index7 alt1\">&nbsp;<\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"php plain\">rails g model Item name:string slug:string priority:string position:integer completed:boolean todo_id:integer` <\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">invoke&nbsp; active_record<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">create&nbsp;&nbsp;&nbsp; db\/migrate\/20190615221812_create_items.rb<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">create&nbsp;&nbsp;&nbsp; app\/models\/item.rb<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">invoke&nbsp;&nbsp;&nbsp; test_unit<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">create&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test\/models\/item_test.rb<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">create&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test\/fixtures\/items.yml<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Now let\u2019s migrate our tables into our db.<\/p>\n\n\n\n<p><code>rake db:migrate<\/code><\/p>\n\n\n\n<p>And we need to add the associations to our Models:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_927012\" class=\"syntaxhighlighter  php\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"php keyword\">class<\/code> <code class=\"php plain\">User &lt; ActiveRecord::Base<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">has_many :todos<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"php functions\">end<\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"php keyword\">class<\/code> <code class=\"php plain\">Todo &lt; ActiveRecord::Base<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">belongs_to :user<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">has_many :items<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"php functions\">end<\/code><\/div>\n<div class=\"line number9 index8 alt2\">&nbsp;<\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"php keyword\">class<\/code> <code class=\"php plain\">Item &lt; ActiveRecord::Base<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">belongs_to :todo<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"php functions\">end<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Ok, where are we at now?<\/h3>\n\n\n\n<p>Seed some data in our database from <code>..\/db\/seeds.rb<\/code>:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_356686\" class=\"syntaxhighlighter  php\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"php plain\"># Create our user<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"php plain\">user = User.create(first_name: <\/code><code class=\"php string\">'Evan'<\/code><code class=\"php plain\">, last_name: <\/code><code class=\"php string\">'Glazer'<\/code><code class=\"php plain\">, email: <\/code><code class=\"php string\">'evanowner@live.com'<\/code><code class=\"php plain\">)<\/code><\/div>\n<div class=\"line number3 index2 alt2\">&nbsp;<\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"php plain\"># Each Todo has 10 Items associated with it<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"php plain\">100.times.each <\/code><code class=\"php keyword\">do<\/code> <code class=\"php plain\">|i|<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">todo = Todo.create(name: <\/code><code class=\"php string\">\"Todo #{i}\"<\/code><code class=\"php plain\">, slug: <\/code><code class=\"php string\">\"todo-#{i}\"<\/code><code class=\"php plain\">, priority: <\/code><code class=\"php string\">'medium'<\/code><code class=\"php plain\">, completed: false, user_id: user.id)<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">10.times.each <\/code><code class=\"php keyword\">do<\/code> <code class=\"php plain\">|k|<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">Item.create(<\/code><code class=\"php string\">\"Item #{k}\"<\/code><code class=\"php plain\">, slug: <\/code><code class=\"php string\">\"Item-#{k}\"<\/code><code class=\"php plain\">, priority: <\/code><code class=\"php string\">'low'<\/code><code class=\"php plain\">, position: j, completed: false, todo_id: todo.id)<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php functions\">end<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"php functions\">end<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Then let\u2019s run <code>rake db:seeds<\/code> to get our data in the db.<\/p>\n\n\n\n<p>Try It \u2013 We should be able to now access all our associations properly<\/p>\n\n\n\n<div>\n<div id=\"highlighter_721753\" class=\"syntaxhighlighter  php\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"php plain\">user = User.first<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"php plain\">user.todos.first.items<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p><strong>Things we will see added and changed for better practices and security measures in the next articles of this series:<\/strong><\/p>\n\n\n\n<div>\n<div id=\"highlighter_712591\" class=\"syntaxhighlighter  php\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"php plain\">* Devise - is a flexible authentication solution <\/code><code class=\"php keyword\">for<\/code> <code class=\"php plain\">Rails based on Warden.<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"php plain\">* Validations to ensure the data we receive <\/code><code class=\"php keyword\">and<\/code> <code class=\"php plain\">create is consistent.<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"php plain\">* FriendlyId is the <\/code><code class=\"php string\">\"Swiss Army bulldozer\"<\/code> <code class=\"php plain\">of slugging <\/code><code class=\"php keyword\">and<\/code> <code class=\"php plain\">permalink plugins <\/code><code class=\"php keyword\">for<\/code> <code class=\"php plain\">Active Record. It lets you create pretty URLs <\/code><code class=\"php keyword\">and<\/code> <code class=\"php plain\">work with human-friendly strings <\/code><code class=\"php keyword\">as<\/code> <code class=\"php keyword\">if<\/code> <code class=\"php plain\">they were numeric ids.<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"php plain\">* Controller Testing<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Here we\u2019re building our <code>TodoController<\/code> (<code>\\app\\controllers\\api\\v1\\todos_controller.rb<\/code>):<\/p>\n\n\n\n<div>\n<div id=\"highlighter_343547\" class=\"syntaxhighlighter  php\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"php keyword\">class<\/code> <code class=\"php plain\">API::V1::TodosController &lt; ApplicationController<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">def index<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">todos = Todo.where(user_id: params[:user_id])<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">render json: todos, each_serializer: TodoSerializer, status: 200 <\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php functions\">end<\/code><\/div>\n<div class=\"line number7 index6 alt2\">&nbsp;<\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">def show<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">todo = Todo.find_by!(user_id: params[:user_id], id: params[:id])<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">render json: todo, each_serializer: TodoSerializer, status: 200<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php functions\">end<\/code><\/div>\n<div class=\"line number12 index11 alt1\">&nbsp;<\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">def create<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">todo = Todo.create!(todo_params)<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">render json: todo, each_serializer: TodoSerializer, status: 200<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php functions\">end<\/code><\/div>\n<div class=\"line number17 index16 alt2\">&nbsp;<\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">def destroy<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">todo = Todo.find_by!(user_id: params[:user_id, id: params[:id]]).destroy!<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">render json: todo, each_serializer: TodoSerializer, status: 200<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php functions\">end<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"php functions\">end<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Then the<code>TodoSerializer<\/code>(<code>\\app\\serializers\\todo_serializer.rb<\/code>) :<\/p>\n\n\n\n<div>\n<div id=\"highlighter_46276\" class=\"syntaxhighlighter  php\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"php keyword\">class<\/code> <code class=\"php plain\">TodoSerializer &lt; ActiveModelSerializers::Model<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">type :todo<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">attributes :first_name, :last_name, :email<\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php plain\">has_many :items<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"php functions\">end<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Time to turn the page! (Just kidding)<\/h3>\n\n\n\n<p>Next, let\u2019s implement our paging technique to our controller for fetching 10 records at a time from our users\u2019 todo lists:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_591597\" class=\"syntaxhighlighter  php\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"php plain\">Install this gem: https:<\/code><code class=\"php comments\">\/\/github.com\/mislav\/will_paginate<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"php plain\">Add to Gemfile `gem <\/code><code class=\"php string\">'will_paginate'<\/code><code class=\"php plain\">, <\/code><code class=\"php string\">'~&gt; 3.1.0'<\/code><code class=\"php plain\">`<\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"php plain\">Then `bundle install`<\/code><\/div>\n<div class=\"line number6 index5 alt1\">&nbsp;<\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"php plain\">Now we want to change our index method in our `TodosController` to paginate.<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>The iOS application will need to keep track of the pages its calling and increment as the user scrolls, etc. Below is setting our per page limit to show 10 Todo lists at a time when we perform a paginated query.<\/p>\n\n\n\n<div>\n<div id=\"highlighter_975783\" class=\"syntaxhighlighter  php\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"php plain\">def index<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">todos = Todo.where(user_id: 1).paginate(page: 1, per_page: 10)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"php spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"php plain\">render json: todos, each_serializer: TodoSerializer, status: 200 <\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"php spaces\">&nbsp;&nbsp;<\/code><code class=\"php functions\">end<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Finish Line<\/h2>\n\n\n\n<p>In this part of the series, we have implemented the ability for our API to show todo cards in our iOS application \u2013 10 cards at a time, specifically. We strengthened our exception handlers to properly respond to the iOS application. And added paging techniques to work within our JSON API Serializers. Now you could have built something like this:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" width=\"1024\" height=\"691\" src=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2019\/08\/962219FF-6315-4A39-803F-A8AA28D37561-1024x691.png\" alt=\"\" class=\"wp-image-24669\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2019\/08\/962219FF-6315-4A39-803F-A8AA28D37561-1024x691.png 1024w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2019\/08\/962219FF-6315-4A39-803F-A8AA28D37561-300x202.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2019\/08\/962219FF-6315-4A39-803F-A8AA28D37561-768x518.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Published on Web Code Geeks with permission by Evan Glazer, partner at our <a href=\"\/\/www.webcodegeeks.com\/join-us\/wcg\/\" target=\"_blank\" rel=\"noopener noreferrer\">WCG program<\/a>. See the original article here: <a href=\"https:\/\/blog.codeship.com\/ruby-on-rails-developer-series-power-of-strong-apis-using-json-and-postgres-database\/\" target=\"_blank\" rel=\"noopener noreferrer\">Ruby on Rails Developer Series: Power of Strong APIs using JSON and Postgres Database<\/a><\/p>\n<p>Opinions expressed by Web Code Geeks contributors are their own.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Welcome to the second of four Ruby on Rails Developer Series. In this series, the goal is to outline how to strengthen your API with Postgres, how to dockerize your project and add security layers to mitigate attacks to your application. In this article, we\u2019ll cycle through strengthening our API-based application that uses the JSON &hellip;<\/p>\n","protected":false},"author":10271,"featured_media":921,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[40,245,95],"class_list":["post-24660","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ruby","tag-json","tag-postgres","tag-rails"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Ruby on Rails Developer Series: Power of Strong APIs using JSON and Postgres Database - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Interested to learn about Postgres Database? Check our article explaining how to strengthen your API with Postgres, and how to dockerize your project.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ruby on Rails Developer Series: Power of Strong APIs using JSON and Postgres Database - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about Postgres Database? Check our article explaining how to strengthen your API with Postgres, and how to dockerize your project.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2019-08-08T09:15:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Evan Glazer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@evan_glazer\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Evan Glazer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/\"},\"author\":{\"name\":\"Evan Glazer\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/99389fa5af3bc43e693c41e0d63e8329\"},\"headline\":\"Ruby on Rails Developer Series: Power of Strong APIs using JSON and Postgres Database\",\"datePublished\":\"2019-08-08T09:15:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/\"},\"wordCount\":533,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg\",\"keywords\":[\"JSON\",\"Postgres\",\"Rails\"],\"articleSection\":[\"Ruby\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/\",\"name\":\"Ruby on Rails Developer Series: Power of Strong APIs using JSON and Postgres Database - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg\",\"datePublished\":\"2019-08-08T09:15:47+00:00\",\"description\":\"Interested to learn about Postgres Database? Check our article explaining how to strengthen your API with Postgres, and how to dockerize your project.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruby\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/ruby\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Ruby on Rails Developer Series: Power of Strong APIs using JSON and Postgres Database\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/99389fa5af3bc43e693c41e0d63e8329\",\"name\":\"Evan Glazer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d682081fa7ff1813f66b9c2d06e8476ca6f3b6956f15f8e38d6fcc6b89292fcd?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d682081fa7ff1813f66b9c2d06e8476ca6f3b6956f15f8e38d6fcc6b89292fcd?s=96&d=mm&r=g\",\"caption\":\"Evan Glazer\"},\"description\":\"Evan Glazer is a software engineer and self-starter at Edukate, where he uses Ember and Ruby on Rails and works with natural language processing and machine learning.\",\"sameAs\":[\"https:\/\/blog.codeship.com\",\"https:\/\/x.com\/evan_glazer\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/evan-glazer\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ruby on Rails Developer Series: Power of Strong APIs using JSON and Postgres Database - Web Code Geeks - 2026","description":"Interested to learn about Postgres Database? Check our article explaining how to strengthen your API with Postgres, and how to dockerize your project.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/","og_locale":"en_US","og_type":"article","og_title":"Ruby on Rails Developer Series: Power of Strong APIs using JSON and Postgres Database - Web Code Geeks - 2026","og_description":"Interested to learn about Postgres Database? Check our article explaining how to strengthen your API with Postgres, and how to dockerize your project.","og_url":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2019-08-08T09:15:47+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg","type":"image\/jpeg"}],"author":"Evan Glazer","twitter_card":"summary_large_image","twitter_creator":"@evan_glazer","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Evan Glazer","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/"},"author":{"name":"Evan Glazer","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/99389fa5af3bc43e693c41e0d63e8329"},"headline":"Ruby on Rails Developer Series: Power of Strong APIs using JSON and Postgres Database","datePublished":"2019-08-08T09:15:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/"},"wordCount":533,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg","keywords":["JSON","Postgres","Rails"],"articleSection":["Ruby"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/","url":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/","name":"Ruby on Rails Developer Series: Power of Strong APIs using JSON and Postgres Database - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg","datePublished":"2019-08-08T09:15:47+00:00","description":"Interested to learn about Postgres Database? Check our article explaining how to strengthen your API with Postgres, and how to dockerize your project.","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/ruby\/power-strong-apis-json-postgres-database\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Ruby","item":"https:\/\/www.webcodegeeks.com\/category\/ruby\/"},{"@type":"ListItem","position":3,"name":"Ruby on Rails Developer Series: Power of Strong APIs using JSON and Postgres Database"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/99389fa5af3bc43e693c41e0d63e8329","name":"Evan Glazer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d682081fa7ff1813f66b9c2d06e8476ca6f3b6956f15f8e38d6fcc6b89292fcd?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d682081fa7ff1813f66b9c2d06e8476ca6f3b6956f15f8e38d6fcc6b89292fcd?s=96&d=mm&r=g","caption":"Evan Glazer"},"description":"Evan Glazer is a software engineer and self-starter at Edukate, where he uses Ember and Ruby on Rails and works with natural language processing and machine learning.","sameAs":["https:\/\/blog.codeship.com","https:\/\/x.com\/evan_glazer"],"url":"https:\/\/www.webcodegeeks.com\/author\/evan-glazer\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/24660","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/10271"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=24660"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/24660\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/921"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=24660"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=24660"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=24660"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}