Consistent error responses for Rails APIs used by React frontends.
rails_react_errors standardizes API error responses so React applications can easily handle validation errors, authentication errors, and server failures.
Instead of handling multiple Rails error formats, this gem provides a single predictable JSON structure.
Add this line to your application's Gemfile:
gem "rails_react_errors"Then run:
bundle installInclude the controller module in your base controller.
class ApplicationController < ActionController::API
include RailsReactErrors::Controller
endThat's it. Your Rails API will now automatically return standardized error responses.
The gem automatically handles common Rails exceptions and converts them into consistent JSON responses.
Supported exceptions:
ActiveRecord::RecordNotFoundActiveRecord::RecordInvalidActiveRecord::RecordNotUniqueActionController::ParameterMissingJSON::ParserErrorStandardError(optional)
Example:
class UsersController < ApplicationController
def show
user = User.find(params[:id])
render json: user
end
endIf the record does not exist:
{
"success": false,
"message": "Couldn't find User with 'id'=99",
"code": "NOT_FOUND",
"errors": {}
}class UsersController < ApplicationController
def create
user = User.create!(user_params)
render json: { success: true, data: user }, status: :created
end
private
def user_params
params.require(:user).permit(:email, :password)
end
endResponse:
{
"success": false,
"message": "Validation failed",
"code": "VALIDATION_ERROR",
"errors": {
"email": ["Email can't be blank"]
}
}If an invalid JSON payload is sent:
{ email: "test"Response:
{
"success": false,
"message": "Invalid JSON payload",
"code": "INVALID_JSON",
"errors": {}
}You can also manually render errors if needed.
render_validation_error(record)
render_not_found_error("User not found")
render_parameter_missing_error("param is missing")
render_conflict_error("Duplicate record")
render_server_error("Something went wrong")
render_error(message:, code:, status:, errors: {})You can configure your own exceptions.
RailsReactErrors.configure do |config|
config.custom_exceptions = {
"Pundit::NotAuthorizedError" => {
code: "FORBIDDEN",
status: :forbidden
},
"JWT::DecodeError" => {
code: "INVALID_TOKEN",
status: :unauthorized
}
}
endTo automatically handle unexpected errors:
RailsReactErrors.configure do |config|
config.rescue_standard_error = true
endMIT License
Manish Prajapati