8000 GitHub - tombenner/has_response: Extremely simple, flexible API support for Rails
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

tombenner/has_response

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

About

Extremely simple, flexible API support for Rails

Resources

4DEA

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

0