Resources

Download Source Code

Summary

# Terminal
rails new apiapp --api
rails g scaffold user first_name last_name email
rails db:migrate

# users_controller.rb
class UsersController < ApplicationController
  before_action :set_user, only: [:show, :update, :destroy]

  # GET /users
  def index
    @users = User.all
    json_render @users
  end

  # GET /users/1
  def show
    json_render @user
  end

  # POST /users
  def create
    # @user = User.new(user_params)
    # if @user.save
    #   json_render @user
    # else
    #   json_render @user.errors, status: :unprocessable_entity
    # end

    @user = User.create!(user_params)
    json_render @user, status: :created
  end

  # PATCH/PUT /users/1
  def update
    # if @user.update(user_params)
    #   render json: @user
    # else
    #   render json: @user.errors, status: :unprocessable_entity
    # end

    @user.update!(user_params)
    json_render @user
  end

  # DELETE /users/1
  def destroy
    @user.destroy!
    json_render @user
  end

  private

  # Use callbacks to share common setup or constraints between actions.
  def set_user
    @user = User.find(params[:id])
  end

  # Only allow a trusted parameter "white list" through.
  def user_params
    params.require(:user).permit(:first_name, :last_name, :email)
  end
end

# application_controller.rb
class ApplicationController < ActionController::API
  include RescueHandler
  def json_render(object, status: :ok)
    render json: object, status: status
  end
end

# app/controllers/concerns/rescue_handler.rb
module RescueHandler
  extend ActiveSupport::Concern
  included do
    rescue_from ActiveRecord::RecordInvalid do |e|
      json_render({message: e.message}, status: :unprocessable_entity)
    end

    rescue_from ActiveRecord::RecordNotFound do |e|
      json_render({message: e.message}, status: :not_found)
    end

    rescue_from StandardError do |e|
      json_render({message: e.message}, status: :unprocessable_entity)
    end
  end
end

# models/user.rb
class User < ApplicationRecord
  validates :email, uniqueness: true
end