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
endget "/" do
user = User.find("123")
render user, include: [:account]
endget "/" do
user = User.find("123")
render user, serializer: 'CustomUserSerializer'
endOr
get "/" do
user = User.find("123")
render CustomUserSerializer.new(user).serialized_json
endmeta 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'
# [...]
endNote that you need the grape-swagger gem for this to work, otherwise it will throw an error.
Code adapted from grape-jsonapi-resources