0.0
The project is in a healthy, maintained state
The api_responser gem provides a standardized way to handle API responses in a Rails application. It includes methods for rendering success and error responses, making it easier to manage and maintain consistent response structures across your application. The gem leverages I18n for localization, allowing dynamic translation of response messages based on method names.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 5.1
~> 1.8

Runtime

~> 7.0
 Project Readme

ApiResponser

Overview

The api_responser gem is designed to streamline the process of handling API responses in your Rails application. It provides a simple and consistent way to render success and error messages, ensuring your API responses are always well-structured and easy to manage.

Key Features

  • Standardized Responses: Simplify the way you handle API responses by using a set of predefined methods for success and error messages.
  • Localization Support: Leverage the power of I18n to dynamically translate response messages, making your API more versatile and user-friendly for a global audience.
  • Ease of Use: With intuitive method names and straightforward implementation, integrating api_responser into your Rails application is quick and hassle-free.
  • Maintenance: Reduce the effort required to maintain consistent response structures across your application, making your codebase cleaner and more maintainable.

A gem to standardize API responses in Rails applications.

All methods return JSON and status.

Installation

Add this line to your application's Gemfile:

gem 'api_responser'

And then execute:

bundle install

Or install it yourself as:

gem install api_responser

Usage

Initialization

class ApplicationController < ActionController::Base
  include ApiResponser
end

Success Response list

List of Items

The records argument is required and should be an Array. The records_count argument is an Integer and is optional.
If records_count is not provided, the count will be calculated from the size of the records array

def record_index(records, records_count = nil)

Show Item

The records argument should be a Hash. It should contain only one model

def record_show(records)

Item Create / Item Update / Item Delete

No arguments are required

def record_created
def record_updated
def record_deleted

Error Response list

Page Not Found / Record Not Found / Method Not Allowed / Not Acceptable / Conflict / Gone / Unsupported Media Type / Too Many Requests / Not Implemented / Service Unavailable

No arguments are required

def page_not_found
def record_not_found
def method_not_allowed
def not_acceptable
def conflict
def gone
def unsupported_media_type
def too_many_requests
def not_implemented
def service_unavailable

Record Not Created / Record Not Updated / Record Not Deleted

The message argument is required, while the debug_message argument is optional.
The report argument is optional and is useful if you would like to handle debug_message.
The message argument is used to output a message in the JSON response, whereas debug_message is useful for providing the real reason for the error (if report is true).

def record_not_created(message, debug_message = "", report:false)
def record_not_updated(message, debug_message = "", report:false)
def record_not_deleted(message, debug_message = "", report:false)

Bad request / Unauthorized / Forbidden / Internal Server Error

The debug_message argument is optional.
The report argument is optional and is useful if you would like to handle debug_message.
The debug_message is useful for providing the real reason for the error (if report is true). The message argument is optional and is useful if you would like to provide your custom message. For example "Incorrect login or password"

def bad_request(debug_message = "", report:false)
def unauthorized(debug_message = "", message:nil, report:false)
def forbidden(debug_message = "", report:false)
def internal_server_error(debug_message = "", report:false)

Customizing Response Templates

You can modify the success and error response templates. Templates should be located in app/views/api_responser/

The default templates are:

success.json.erb

"data":{
  "status": "success",
  "code": <%= @code %>,
  "message": "<%= @message %>",
  "records": <%= @records.to_json %>,
  "records_count": <%= @records_count %>
}

error.json.erb

"data":{
  "status": "error",
  "code": <%= @code %>,
  "message": "<%= @message %>"
}

Customizing Error Handling

The gem provides a default error handler in ApiResponserHelper:

module ApiResponserHelper
  def self.error_handling(code: nil, debug_message: nil, message: nil)
    Logger.new(STDOUT).fatal("Error with code #{code}. Debug message: #{debug_message}. Message: #{message}")
  end
end

You can customize this method to handle errors in a way that suits your application's requirements. For example, you might want to log errors to a file or send notifications to an external service. Helper should be located in app/helpers/app_responser_helper.rb

Localization

ApiResponser uses I18n for localization.

Default localization located in config/locale/en.yml

Example

class ApplicationController < ActionController::Base
  #include ApiResponser in ApplicationController
  include ApiResponser
end

class SomeController < ApplicationController
  before_action do
    set_model_variable("ModelName")
  end  
  before_action :find, only: [:show, :update, :destroy]

  def index
    itemList = @modelName.all
    render record_index(itemList)

    # could be using with counter for pagination
    itemList = @modelName.where(:name => "value")
    render record_index(itemList.limit(5), itemList.count)
  end

  def show
    render record_show(@obj)
  end

  def create
    item = @modelName.new(model_params)
    if item.save
      render record_created
    else
      render record_not_created(item.errors, report:true)
    end
  end

  def update
    if @obj.update(model_params)
      render record_updated
    else
      render record_not_updated(@obj.errors, report:true)
    end
  end

  def destroy
    if @obj.destroy
      render record_deleted
    else
      render record_not_deleted(@obj.errors, report:true)
    end
  end


  private
  def find
    @obj = @modelName.find_by(:id => params[:id])
    unless @obj
      render record_not_found
    end
  end

  def model_params
    params.require(:model).permit(:name)
  end  

  def set_model_variable modelName
    @modelName = modelName.constantize
  end
end

Buy me a coffee

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

License

MIT