Table of Contents
- Create the application
- Create the controller and model for Post
- Set up Routes with namespaces
- Set up the Post controller.
- Test the api using [postman](https://www.getpostman.com/)
Create the application
You can make an API-only RoR application by just adding --api at the end of rails new command.
$ rails new blog --apiCreate the controller and model for Post
You can generate the Post Controller and Post Model by running commands below.
$ rails g model post title:string
$ rails g controller posts
$ rake db:migrateSet up Routes with namespaces
Namespaces enable you to easily control the versions of your API.
Rails.application.routes.draw do
namespace 'api' do
namespace 'v1' do
resources :posts
end
end
endThe code above creates routes like the following. (You can check the routes of your application with rake routes command.)
$ rake routes
api_v1_posts GET /api/v1/posts(.:format) api/v1/posts#index
POST /api/v1/posts(.:format) api/v1/posts#create
api_v1_post GET /api/v1/posts/:id(.:format) api/v1/posts#show
PATCH /api/v1/posts/:id(.:format) api/v1/posts#update
PUT /api/v1/posts/:id(.:format) api/v1/posts#update
DELETE /api/v1/posts/:id(.:format) api/v1/posts#destroySet up the Post controller.
Create the api and v1 directories under your controllers directory. Your controllers directory should look like this.
controllers/
├ api/
│ └ v1/
│ └ posts_controller.rb
│Define methods for getting, creating, updating and deleting posts like the code below.
module Api
module V1
class PostsController < ApplicationController
def index
posts = Post.order(created_at: :desc)
render json: { status: 'SUCCESS', message: 'loaded posts', data: posts }
end
def show
post = Post.find(params[:id])
render json: { status: 'SUCCESS', message: 'loaded the post', data: post }
end
def create
post = Post.new(post_params)
if post.save
render json: { status: 'SUCCESS', message: 'loaded the post', data: post }
else
render json: { status: 'ERROR', message: 'post not saved', data: post.errors }
end
end
def destroy
post = Post.find(params[:id])
post.destroy
render json: { status: 'SUCCESS', message: 'deleted the post', data: post }
end
def update
post = Post.find(params[:id])
if post.update(post_params)
render json: { status: 'SUCCESS', message: 'updated the post', data: post }
else
render json: { status: 'SUCCESS', message: 'loaded the post', data: post }
end
end
private
def post_params
params.require(:post).permit(:title)
end
end
end
endTest the api using postman
Let’s create some data we can play with on rails console.
$ rails c
2.4.4 :001 > Post.create(title:'title1')
2.4.4 :001 > Post.create(title:'title2')Next, Run the api!
$ rails sOpen postman and test the following requests.
Get(http://localhost:3000/api/v1/posts)
You can retrieve all the posts you have created on the console.

GET(http://localhost:3000/api/v1/posts/:id)
You can retrieve one specific post that has id = 1.

POST (http://localhost:3000/api/v1/posts)
You can create a new post with a POST request.
So change the selected option in the box on the right from GET to POST and pass json data in the body.

PUT(http://localhost:3000/api/v1/posts/:id)
Change the selected option to PUT and pass json data.

DELETE(http://localhost:3000/api/v1/posts/:id)
Change the selected option to DELETE and pass json data.

I’ve usded postman in this post, but you can of course use curl command to do the same.