Http Status Rails
This gem makes http status rendering cool. It provides a minimal rendering content for every status and format included in Ruby On Rails.
Usage
Basic
To render a status in a controller, you can just call the render_status
method:
def show
@user = User.find_by id: params[:id]
render_status :not_found if @user.nil?
end
Depending on the request format, it will respond with a basic message:
HTML
<!-- Wrapped into layouts/application by default -->
<h1>404 Not Found</h1>
<p>The page you are looking for does not exist.</p>
JSON
{
"status": 404,
"title": "Not Found",
"message": "The page you are looking for does not exist."
}
Formats supported by default
- text
- json
- yaml
- xml
- svg
- js
- html
- rss
- atom
- ics
- csv
If the request format isn't in this list and you haven't created any template to handle it, the server will respond with a html format (The Restrict render format section explain how to customize this behavior).
You can also explicitly set the rendering format or the layout:
render_status :bad_request, format: :js, layout: 'layouts/status'
# Set layout to false if you doesn't want any layout
# If the layout isn't found for the given format, it's assumed to be false
The response could be:
// Asuming that layouts/status.js.erb wraps JavaScript into a jQuery callback
$(function() {
window.http = { "code": 400, "title": "Bad Request", "message": "The server cannot or will not process the request due to something that is perceived to be a client error." }
});
Templating
You can override these responses or create new ones by adding status
named templates in the app/views/http
folder. (eg: app/views/http/status.html.erb
, app/views/http/status.csv.erb
)
You'll have access to a @status
variable which contains the following methods:
-
key
: The symbol you provided to therender_status
method. (If this symbol isn't registered by Rails within valid http status, it'll be replaced by:internal_error
) -
code
: The code corresponding to the status. (eg: for:not_found
it'll be404
) -
title
: The title of the status (eg: for:not_found
it'll be «Not Found») -
message
: The message of the status (eg: for:not_found
it'll be «The page you are looking for does not exist.») -
error?
: Indicates if the status is considered as an error (4xx and 5xx codes).
Layout
You can configure the layout you want to use in your controller with the status_layout
method:
class ApplicationController < ActionController::Base
status_layout 'status' # By default: 'application'
# If the layout isn't found for the current format, it's assumed to be false
end
Localizing
This gem uses I18n
to provide localized contents. You can override or translate these contents by adding new yaml keys under the config/locales
folder:
fr:
http_status:
not_found:
code: 404
title: Page introuvable
message: La page que vous recherchez n'existe pas
Every key which lives directly under http_status
exactly matches the corresponding status symbol provided by Rails.
Helpers
Handle Not Found
You can easily handle Not Found status by calling the handles_not_found_status
method in a controller and in the config/routes.rb
file:
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
handles_not_found_status
end
# config/routes.rb
Rails.application.routes.draw do
# ...
handles_not_found_status # Put this at the very bottom of the block
end
This method will respond with a Not Found page (in html, json, ...) when a record isn't found (eg: User.find params[:id]
), or when there is any routing problem (controller not found, action not found).
Handle generic errors (as error 500)
You can easily handle generic exceptions within your controller by calling the handles_error_status
method.
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
handles_error_status
end
This method will respond with a Internal Server Error page (in html, json, ...) when any error occurs while handling the request.
Restrict render formats
Http status will all be rendered in json, whatever the request format is:
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
status_formats only: :json
end
Http status will all be rendered in json or html, but will fallback on html because it's the first one:
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
status_formats only: [:html, :json]
end
Http status will be rendered in html for csv, yaml and rss formats:
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
status_formats except: [:csv, :yaml, :rss]
end
Http status will be rendered in json for csv, yaml and rss formats, or when the format is unknown, or when json is the original request format. The status will be rendered in html when it's the original request format:
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
status_formats except: [:csv, :yaml, :rss], only: [:json, :html]
end
Installation
Add this line to your application's Gemfile:
gem 'httpstatus-rails'
And then execute:
$ bundle
Or install it yourself as:
$ gem install httpstatus-rails
License
The gem is available as open source under the terms of the MIT License.