Resource-Oriented Architectures in Ruby.
Roar JSON API provides support for JSON API, a specification for building APIs in JSON. It can render and parse singular and collection documents.
A minimal representation of a Resource can be defined as follows:
require 'roar/json/json_api'
class SongsRepresenter < Roar::Decorator
include Roar::JSON::JSONAPI.resource :songs
attributes do
property :title
end
end
Properties (or attributes) of the represented model are defined within an
attributes
block.
An id
property will automatically defined when using Roar JSON API.
To define relationships, use ::has_one
or ::has_many
with either an inline
or a standalone representer (specified with the extend:
or decorates:
option).
class SongsRepresenter < Roar::Decorator
include Roar::JSON::JSONAPI.resource :songs
has_one :album do
property :title
end
has_many :musicians, extend: MusicianRepresenter
end
Meta information can be included into rendered singular and collection documents in two ways.
You can define meta information on your collection object and then let Roar compile it.
class SongsRepresenter < Roar::Decorator
include Roar::JSON::JSONAPI.resource :songs
meta toplevel: true do
property :page
property :total
end
end
Your collection object must expose the respective methods.
collection.page #=> 1
collection.total #=> 12
This will render the {"meta": {"page": 1, "total": 12}}
hash into the JSON API document.
Alternatively, you can provide meta information as a hash when rendering. Any values also defined on your object will be overriden.
collection.to_json(meta: {page: params["page"], total: collection.size})
Both methods work for singular documents too.
class SongsRepresenter < Roar::Decorator
include Roar::JSON::JSONAPI.resource :songs
meta do
property :label
property :format
end
end
song.to_json(meta: { label: 'EMI' })
If you need more functionality (and parsing), please let us know.
As JSON API per definition can represent singular models and collections you have two entry points.
SongsRepresenter.prepare(Song.find(1)).to_json
SongsRepresenter.prepare(Song.new).from_json("..")
Singular models can use the representer module directly.
SongsRepresenter.for_collection.prepare([Song.find(1), Song.find(2)]).to_json
SongsRepresenter.for_collection.prepare([Song.new, Song.new]).from_json("..")
Parsing currently works great with singular documents - for collections, we are still working out how to encode the application semantics. Feel free to help.
Questions? Need help? Free 1st Level Support on irc.freenode.org#roar ! We also have a mailing list, yiha!
Roar is released under the MIT License.