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