0.0
No commit activity in last 3 years
No release in over 3 years
Decorate your controller classes with acts_as_service :model_name, and instantly support JSON/XML CRUD interface. Allow client to specify response contents using query string filter parameters.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies
 Project Readme

Serviceable

Serviceable aims to reduce code duplication for common patterns, such as JSON/XML API endpoints. Instead of repeating the same patterns in multiple controllers and trying to maintain that over time, we extracted those patterns into a module.

Configuration:

gem 'serviceable'

Controller:

class PostsController < ApplicationController

  include Serviceable
  acts_as_service :post

end

Basic Routes:

resources :posts

Advanced Feature Routes:

resources :posts do
  collection do
    get :count
    get :describe
  end
end

Standard CRUD

POST /posts.json
GET /posts.json
GET /posts/1.json
PUT /posts/1.json
DELETE /posts/1.json

Advanced Features

Retrieve the number of records using the given query params

GET /posts/count.json
86

Use query params to filter the set

GET /posts/count.json?where[posts][author_id]=123
14

Discover the available extensions beyond basic CRUD, such as allowed includes and methods

GET /posts/describe.json
{"allowed_includes":["tags","author"],"allowed_methods":[]}

Query Params

Full listing returned when no query params are given

GET /posts.json
[{"id":1,"title":"First Post!","body":"Feels good to be first","created_at":"20130727T16:26:00Z"}]

Use the only and/or except params to specify fields on the collection

GET /posts.json?only=id,title
[{"id":1,"title","First post!"}]

Use the include param to specify associated objects or collections

GET /posts.json?include=user
[{"id":1,"title":"First Post!","body":"Feels good to be first","created_at":"20130727T16:26:00Z","user":{"id":2,"first_name":"Jim","last_name":"Walker","display_name":"Jim W."}}]

Use the methods param to include the return values from a set of methods on each object

GET /posts.json?methods=max_rating
[{"id":1,"title":"First Post!","body":"Feels good to be first","created_at":"20130727T16:26:00Z","max_rating":3}]

Combine params to configure the result contents

GET /posts.json?only=id,title&include[user][only]=first_name,last_name
[{"id":1,"title":"First Post!","user":{"first_name":"Jim","last_name":"Walker"}}]

Filter Params

Use the where param to filter the results

GET /posts.json?where[posts][published]=true

Use associated objects or collections to filter the set

GET /posts.json?where[tags][label]=Pinball

Integrating with jQuery

Working with a serviceable endpoint is easy with jQuery. Here's an example of a request for all posts tagged as "Pinball" including only post id and title:

$.ajax({
  url: '/posts.json',
  type: 'GET',
  data: {
    where: {
      tags: {
        label: 'Pinball'
      }
    },
    only: 'id,title'
  },
  success: function(xhr,msg,data) {
    console.log("received "+data.responseJSON.length+" results");
  }
});