In order to get a Hanami app rolling with jsonapi-rb, you will usually want to follow those 3 steps:
jsonapi-hanami
to your Gemfile
:# Gemfile
gem 'jsonapi-hanami'
:jsonapi
MIME type (for serialization):# apps/foo/application.rb
module Foo
class Application < Hanami::Application
configure do
# ...
controller.format jsonapi: 'application/vnd.api+json'
# ...
end
end
end
# apps/foo/application.rb
module Foo
class Application < Hanami::Application
configure do
# ...
body_parsers :json
# ...
end
end
end
apps/foo/resources/
to the load_path
:# apps/foo/application.rb
module Foo
class Application < Hanami::Application
configure do
# ...
load_paths << [
# ...
'resources'
]
# ...
end
end
end
When using jsonapi-rb with Hanami (via the jsonapi-hanami gem), enabling of
jsonapi-rb features is opt-in, and is done by including
JSONAPI::Hanami::Action
in your actions.
Rendering is done by setting options directly on the controller action instance.
The primary data is set via the self.data
setter.
Example:
module API::Controllers::Posts
class Create
include API::Action
include JSONAPI::Hanami::Action
expose :url_helpers
def call(params)
# ...
@url_helpers = routes # Will be available inside serializable resources.
self.data = posts
self.include = [:author, comments: [:author]]
self.fields = { users: [:name, :email],
posts: [:title, :content] }
end
end
end
# Gemfile
gem 'jsonapi-hanami'
# apps/api/controllers/posts/create.rb
module API::Controllers::Posts
class Create
include API::Action
include JSONAPI::Hanami::Action
deserializable_resource :post
params do
required(:post).schema do
required(:title)
required(:content)
required(:tag_ids)
end
end
def call(params)
repo = PostRepository.new
post = repo.create(params[:post])
self.data = post
self.include = [:author, comments: [:author]]
self.fields = { users: [:name, :email] }
self.status = 201
end
end
end