Use jsonapi-serializer with Grape.
Add grape-jsonapi
to your Gemfile.
gem 'grape-jsonapi', require: "grape_jsonapi"
class API < Grape::API
content_type :jsonapi, "application/vnd.api+json"
formatter :json, Grape::Formatter::Jsonapi
formatter :jsonapi, Grape::Formatter::Jsonapi
end
get "/" do
user = User.find("123")
render user, include: [:account]
end
get "/" do
user = User.find("123")
render user, serializer: 'CustomUserSerializer'
end
Or
get "/" do
user = User.find("123")
render CustomUserSerializer.new(user).serialized_json
end
meta
and links
properties are usually defined per resource within your serializer (here and here)
However, if you need to override those properties, you can pass them as options when rendering your response:
user = User.find("123")
render user, meta: { pagination: { page: 1, total: 42 } }, links: { self: 'https://my-awesome.app.com/users/1' }
When using Grape with Swagger via grape-swagger, you can generate response documentation automatically via the provided following model parser:
# FastJsonapi serializer example
# app/serializers/base_serializer.rb
class BaseSerializer; end
# app/serializers/user_serializer.rb
class UserSerializer < BaseSerializer
include JSONAPI::Serializer
set_type :user
has_many :orders
attributes :name, :email
end
# config/initializers/grape_swagger.rb
GrapeSwagger.model_parsers.register(GrapeSwagger::Jsonapi::Parser, BaseSerializer)
# Your grape API endpoint
desc 'Get current user' do
success code: 200, model: UserSerializer, message: 'The current user'
# [...]
end
Note that you need the grape-swagger
gem for this to work, otherwise it will throw an error.
Code adapted from grape-jsonapi-resources