Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Extremely simple, flexible API support for Rails
Ruby
branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
app/concerns
lib
.gitignore
Gemfile
MIT-LICENSE
README.md
Rakefile
has_response.gemspec

README.md

Has Response

Extremely simple API support for Rails models

Description

Has Response provides very simple support for turning model instances into JSONifiable hashes for use in API responses. The hashes contain only the attributes that are specified, and they can contain hashes of N-order associations as well.

Installation

Add Has Response to your Gemfile:

gem 'has_response'

Usage

Include HasResponse and define to_response in your model:

class User < ActiveRecord::Base
  include HasResponse

  def to_response
    {
      id: id,
      username: username,
      avatar_url: avatar.url(:thumb)
    }
  end
end

There's nothing special here yet, but you can now return JSON of users more easily in controllers:

class UsersController < ApplicationController
  def show
    user = User.find(params[:id])
    render :json => user.to_response
  end
end

Say you want to include the user's Location in your response, too. Set up Location:

class Location < ActiveRecord::Base
  include HasResponse

  def to_response
    {
      id: id,
      city: city,
      state: state
    }
  end
end

And the association:

class User < ActiveRecord::Base
  #...
  belongs_to :location
  #...
end

Then change user.to_response to:

user.to_response_with(:location)

This will return:

{
  id: 1,
  username: "johndoe",
  avatar_url: "http://mysite.com/myavatar.jpg",
  location: {
    id: 1,
    city: "San Francisco",
    state: "CA"
  }
}

If you want to add additional columns or method values to any responses, those can be included just like associations are included. If User responds to a method named posts_count, you can easily include that, too:

user.to_response_with(:location, :posts_count)

This will return:

{
  id: 1,
  username: "johndoe",
  avatar_url: "http://mysite.com/myavatar.jpg",
  location: {
    id: 1,
    city: "San Francisco",
    state: "CA"
  },
  posts_count: 2
}

You can include associations of N-order. To include a User's Posts, and those Posts' Comments, including their User, use:

user.to_response_with(:location, :posts => {:comments => :user})

This will return:

{
  id: 1,
  username: "johndoe",
  avatar_url: "http://mysite.com/myavatar.jpg",
  location: ...,
  posts: [
    {
      id: 1,
      title: "My First Post",
      content: "My first post!",
      comments: [
        {
          id: 1,
          content: "Great post!",
          user: {
            id: 2,
            username: "Jane Doe",
            avatar_url: "http://mysite.com/myavatar.jpg"
          }
        }
      ]
    }
  ]
}

License

Has Response is released under the MIT License. Please see the MIT-LICENSE file for details.

Something went wrong with that request. Please try again.