Building a RESTful API with Rails
Every time I create a new Rails API with a PostgreSQL database, I find myself googling “create a new Rails API with a PostgreSQL database”. So I’m leaving these notes here for myself, and anyone else who finds this helpful.
For the purpose of this tutorial, let’s imagine we’re creating a super awesome app, and we’re going to call it Super Awesome App.
Installation of Ruby and Rails
The first step to building a RESTful CRUD API with Ruby on Rails is to verify that both Ruby and Rails are installed. (macOS Steps)
Open the terminal and run the following command:
ruby -v
This command verifies the version of Ruby installed. If Ruby is not installed, run the following command:
rvm install 2.7.4 --default
# replace 2.7.4 with the desired Ruby version
To install Rails, run the following command:
gem install bundler
gem install rails
Installation of PostgreSQL
Download the latest version of Postgres from Postgres.app or install using brew:
brew install postgresql
brew services start postgresql
Create a Rails Application
Open the terminal or command prompt, navigate to the desired directory, and run the following command:
rails new redwhite_project --api --minimal --database=postgresql
This command sets the application to be an API with minimal dependencies and sets the database to PostgreSQL.
Generating a Resource
The next step is to create a migration and model for the API. This can be accomplished by using a Rails generator
.
Open the terminal or command prompt and run the following command:
rails g resource Minister first_name last_name genre
# This is also be written as:
# rails g resource Minister first_name:string last_name:string genre:string
This command generates a new model, controller, and migration file for the Minister resource.
Optional: Create Seed Data
Open the seeds file located at db/seeds.rb and input the following:
Minister.create!(first_name: 'xam', last_name: 'Txhomas', genre: 'rock')
Minister.create!(first_name: 'xarah', last_name: 'Jxones', genre: 'pop')
Minister.create!(first_name: 'xoe', last_name: 'Sxmith', genre: 'country')
Minister.create!(first_name: 'xen', last_name: 'Axdams', genre: 'folk')
Perform Migration
Open the terminal or command prompt and run the following command:
rails db:create db:migrate
# If using seed data, run:
# rails db:create db:migrate db:seed
when finding error just do 2 this optional
rake db:create:all
rake db:migrate
Define the Config Routes
Navigate to config/routes.rb and define the routes using one of the following methods:
Rails.application.routes.draw do
# Option 1 - Allow all controller actions
resources : minister
# Option 2 - Allow specific controller actions
resources :minister, only: [:index, :create, :destroy]
# Option 3 - Define specific controller action
get '/minister', to: 'minister#index'
end
Define Controller Actions
Suggested Active Record Rescues
The rescue_from
method is an important feature in Rails that enables centralized error handling, thereby preventing duplication of error handling logic across multiple controller actions. For example, the ActiveRecord::RecordNotFound
exception occurs when a record is not found in the database and is handled by rendering a 404 Record Not Found response to the user. On the other hand, the ActiveRecord::RecordInvalid
exception is raised when a record fails to save to the database due to validation errors and is handled by rendering a 422 Unprocessable Entity response along with the validation errors.
class Minister < ApplicationController
rescue_from ActiveRecord::RecordNotFound, with: :render_not_found_response
rescue_from ActiveRecord::RecordInvalid, with: :render_unprocessable_entity_response
private
def render_not_found_response
render json: { error: "Minister Not Found" }, status: :not_found
end
def render_unprocessable_entity_response(invalid)
render json: { errors: invalid.record.errors.full_messages }, status: :unprocessable_entity
end
end
**Index Action: GET /**minister
This route is used to retrieve a collection of resources. Typically returns a list of all the resources in the database.
def index
render json: Minister.all
end
Show Action: GET /minister/:id
This route is used to retrieve a single resource by its unique identifier or primary key. Typically returns a single resource.
def show
render json: Minister.find(params[:id])
end
**Create Action: POST /**minister
This route is used to create a new resource. Typically returns the newly created resource.
def create
minister = Minister.create!(minister_params)
render json: minister, status: :created
end
private
def minister_params
params.permit(:first_name, :last_name, :genre)
end
Update Action: PATCH or PUT /minister/:id
This route is used to update an existing resource by its unique identifier or primary key. Typically returns the updated resource.
def update
minister = Minister.find(params[:id])
minister.update!(minister_params)
render json: minister
end
Destroy Action: DELETE /minister/:id
This route is used to delete a resource by its unique identifier or primary key. Typically returns a response with a status code of 204 (No Content) to indicate that the resource has been deleted.
def destroy
Minister.find(params[:id]).destroy
head :no_content
end
Closing
Thank-you for reading this guide to building a RESTful CRUD API with Ruby on Rails and PostgreSQL.
References;
https://github.com/rokhimin/ruby-CRUD
https://medium.com/@hanpersonality/basic-crud-operations-of-rdbms-with-postgresql-d613c6c4d00c
https://github.com/nejdetkadir/simple-rails-crud
https://dev.to/justahmed99/crud-rest-api-with-nodejs-expressjs-and-postgresql-57b2
https://medium.com/@ethanryan/creating-a-new-rails-api-with-a-postgresql-database-488ffce649d9
https://github.com/JamesHuangUC/Ruby-on-Rails-CRUD
https://dev.to/nemwelboniface/api-with-rails-7-ngh
https://startup-house.com/blog/creating-a-project-with-ruby-on-rails
https://www.protonshub.com/blogs/power-up-your-development-with-ruby-on-rails
https://github.com/bensheldon/good_job
https://www.protonshub.com/blogs/power-up-your-development-with-ruby-on-rails
https://www.monterail.com/blog/how-to-build-restful-apis-with-ruby-on-rails