Exposed

A Rails engine that exposes ActiveRecord models as a JSON API with minimum hassle.

Installation

gem install exposed

Usage

Suppose you have some ActiveRecord models:

class Post < ActiveRecord::Base
    attr_accessible :content, :title
    has_many :comments
end

class Comment < ActiveRecord::Base
    attr_accessible :post, :content
    belongs_to :post
end

To expose them as JSON API, you need to do two things:

1. Create controllers in /controllers:

class PostsController < Exposed::Base
end

class CommentsController < Exposed::Base
end

2. Add routes to /config/routes.rb:

resources :posts
resources :comments

GET

The collections will be available at:

GET /posts GET /comments

They will return JSON, of course. For example, /posts will return:

[
    {
        "id"       : 1,
        "title"    : "First post",
        "content"  : "First post content"
    },

    {
        "id"       : 2,
        "title"    : "Second post",
        "content"  : "Second post content"
    }
]

By default, each model's JSON representation will include all attributes. If you want to include associations, you can use include URL parameter:

GET /posts?include=comments

This will return:

[
    {
        "id"       : 1,
        "title"    : "First post",
        "content"  : "First post content"
        "comments" : [
            { "id": 1, "post_id": 1, "content": "You are right." },
            { "id": 2, "post_id": 1, "content": "You are wrong." }
        ]
    },

    {
        "id"       : 2,
        "title"    : "Second post",
        "content"  : "Second post content"
        "comments" : []
    }
]

If you want to exclude some attributes, you can use the exclude URL parameter:

GET /posts?exclude=id,content

This will return:

[
    { "title"    : "First post" },
    { "title"    : "Second post" }
]

Individual models are available at:

GET /posts/1

This will return:

{
    "id"       : 1,
    "title"    : "First post",
    "content"  : "First post content"
}

And you can use include and exclude URL parameters just like with collections.

POST

New models can be created by posting JSON to:

POST /posts { "title": "Third post", "content": "Third post content" }

The JSON representation of the newly created model is returned.

PUT

Models can be modified by putting JSON to:

PUT /posts/1 { "title": "Modified post", "content": "Modified post content" }

The new JSON representation of the modified model is returned. The ommited attributes remain unchanged, so PUT actually behaves like PATCH (sorry, REST).

DELETE

Models can be deleted by sending a DELETE request to:

DELETE /posts/1

The JSON representation of the deleted model is returned.

License

MIT.