Skip to content

kenaniah/rails-swagger

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Rails::Swagger

Creates mountable Rails engines to serve the actual APIs defined in your Swagger spec files.

What it does:

  • Automatically routes API endpoints based on your Swagger spec files
  • Automatically validates request parameters using JSON Schema before they are passed to controller actions
  • Allows multiple spec files to be mounted
  • Supports JSON spec files
  • Supports YAML spec files

Installation

Add this line to your application's Gemfile then execute bundle install:

gem 'rails-swagger'

Usage

Simply mount your swagger files within your routing tree...

# config/routes.rb

Rails.application.routes.draw do

  # Mounts on /v1 with a controller prefix of Api::V1::
  mount Rails::Swagger::Engine("Api::V1", "path/to/swagger_api_v1.json"), at: :v1, as: :v1

  # Mounts on /pet_store with a controller prefix of PetStore::
  mount Rails::Swagger::Engine("PetStore", "path/to/petstore.yaml"), at: :pet_store, as: :pet_store

end

Verify that your routes are loaded...

$ rake routes

And ensure that your controllers include the module that rails-swagger generates for you:

class PetStore::PetsController < ApplicationController
  include PetStore::SwaggerController
end

class Api::V1::Nested::ExampleController < ApplicationController
  include Api::V1::SwaggerController
end

Technical Details

Syntactic Sugar

Unless you've used something like Sequel before, the syntactic sugar of how engines are defined may look strange at first glance.

Under the hood, those engines are actually created via a method call that returns a newly-created subclass. Rails::Swagger:Engine is not a class, but simply a method that returns one.

Rails::Swagger#Engine

A method that takes two arguments. The first represents the namespace that will be used to prefix everything related to this engine. This includes any controllers used by the engine, the SwaggerController helper module, and the engine itself.

The second argument is the path to the swagger spec file to route from. This gem utilizes RESTful routing conventions and assumes your controllers / actions will be named accordingly.

YourModulePrefix#SwaggerController

A module that is defined when Rails::Swagger#Engine is invoked. It should be included in every controller that handles routes managed by rails-swagger. Please note that an instance of this module is created for every swagger spec file that is mounted.

Contributing

Pull requests are welcome!