From 2dd569ae51b43e93dbe0e20b3104eaf63587542b Mon Sep 17 00:00:00 2001 From: Ivan Yurov Date: Thu, 1 Oct 2015 22:48:57 -0400 Subject: [PATCH] Add Serializer 'type' directive to control type field, for use by the JsonApi adapter --- lib/active_model/serializer.rb | 5 +++ .../serializer/adapter/json_api.rb | 1 + .../json_api/resource_type_config_test.rb | 32 +++++++++++++------ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 61343378..aa76dcb2 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -46,6 +46,10 @@ module ActiveModel super end + def self.type(type) + self._type = type + end + def self.attributes(*attrs) attrs = attrs.first if attrs.first.class == Array @@ -122,6 +126,7 @@ module ActiveModel end attr_accessor :object, :root, :meta, :meta_key, :scope + class_attribute :_type, instance_writer: false def initialize(object, options = {}) self.object = object diff --git a/lib/active_model/serializer/adapter/json_api.rb b/lib/active_model/serializer/adapter/json_api.rb index 3637ccb7..3d097985 100644 --- a/lib/active_model/serializer/adapter/json_api.rb +++ b/lib/active_model/serializer/adapter/json_api.rb @@ -71,6 +71,7 @@ module ActiveModel end def resource_identifier_type_for(serializer) + return serializer._type if serializer._type if ActiveModel::Serializer.config.jsonapi_resource_type == :singular serializer.object.class.model_name.singular else diff --git a/test/adapter/json_api/resource_type_config_test.rb b/test/adapter/json_api/resource_type_config_test.rb index 859ea7a7..39462b99 100644 --- a/test/adapter/json_api/resource_type_config_test.rb +++ b/test/adapter/json_api/resource_type_config_test.rb @@ -5,6 +5,11 @@ module ActiveModel module Adapter class JsonApi class ResourceTypeConfigTest < Minitest::Test + class ProfileTypeSerializer < ActiveModel::Serializer + attributes :name + type 'profile' + end + def setup @author = Author.new(id: 1, name: 'Steve K.') @author.bio = nil @@ -36,22 +41,29 @@ module ActiveModel end def test_config_plural - with_adapter :json_api do - with_jsonapi_resource_type :plural do - hash = ActiveModel::SerializableResource.new(@comment).serializable_hash - assert_equal('comments', hash[:data][:type]) - end + with_jsonapi_resource_type :plural do + hash = serializable(@comment, adapter: :json_api).serializable_hash + assert_equal('comments', hash[:data][:type]) end end def test_config_singular - with_adapter :json_api do - with_jsonapi_resource_type :singular do - hash = ActiveModel::SerializableResource.new(@comment).serializable_hash - assert_equal('comment', hash[:data][:type]) - end + with_jsonapi_resource_type :singular do + hash = serializable(@comment, adapter: :json_api).serializable_hash + assert_equal('comment', hash[:data][:type]) end end + + def test_explicit_type_value + hash = serializable(@author, serializer: ProfileTypeSerializer, adapter: :json_api).serializable_hash + assert_equal('profile', hash.fetch(:data).fetch(:type)) + end + + private + + def serializable(resource, options = {}) + ActiveModel::SerializableResource.new(resource, options) + end end end end