From 54303b62901737333e4620ff3a9847610a409f84 Mon Sep 17 00:00:00 2001 From: Lucas Hosseini Date: Tue, 6 Oct 2015 19:44:44 +0200 Subject: [PATCH] Add support for toplevel JSON API links. --- lib/active_model/serializable_resource.rb | 2 +- .../serializer/adapter/json_api.rb | 5 +++ test/adapter/json_api/links_test.rb | 32 +++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/adapter/json_api/links_test.rb diff --git a/lib/active_model/serializable_resource.rb b/lib/active_model/serializable_resource.rb index 56453dd9..dea94eb1 100644 --- a/lib/active_model/serializable_resource.rb +++ b/lib/active_model/serializable_resource.rb @@ -1,7 +1,7 @@ require 'set' module ActiveModel class SerializableResource - ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter, :meta, :meta_key]) + ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter, :meta, :meta_key, :links]) # Primary interface to composing a resource with a serializer and adapter. # @return the serializable_resource, ready for #as_json/#to_json/#serializable_hash. diff --git a/lib/active_model/serializer/adapter/json_api.rb b/lib/active_model/serializer/adapter/json_api.rb index 2792af09..716b34b0 100644 --- a/lib/active_model/serializer/adapter/json_api.rb +++ b/lib/active_model/serializer/adapter/json_api.rb @@ -65,6 +65,11 @@ module ActiveModel ApiObjects::JsonApi.add!(hash) + if instance_options[:links] + hash[:links] ||= {} + hash[:links].update(instance_options[:links]) + end + hash end diff --git a/test/adapter/json_api/links_test.rb b/test/adapter/json_api/links_test.rb new file mode 100644 index 00000000..d3b56ee9 --- /dev/null +++ b/test/adapter/json_api/links_test.rb @@ -0,0 +1,32 @@ +require 'test_helper' + +module ActiveModel + class Serializer + module Adapter + class JsonApi + class LinksTest < Minitest::Test + def setup + @post = Post.new(id: 1337, comments: [], author: nil) + end + + def test_toplevel_links + hash = ActiveModel::SerializableResource.new( + @post, + adapter: :json_api, + links: { + self: { + href: '//posts' + } + }).serializable_hash + expected = { + self: { + href: '//posts' + } + } + assert_equal(expected, hash[:links]) + end + end + end + end + end +end