Merge pull request #1425 from beauby/extract-serializer-modules

[CLEANUP] Extract links and type-related methods to their own module.
This commit is contained in:
Benjamin Fleischer 2016-01-15 00:56:40 -06:00
commit 87ca408ead
4 changed files with 63 additions and 31 deletions

View File

@ -8,6 +8,8 @@ require 'active_model/serializer/caching'
require 'active_model/serializer/configuration' require 'active_model/serializer/configuration'
require 'active_model/serializer/fieldset' require 'active_model/serializer/fieldset'
require 'active_model/serializer/lint' require 'active_model/serializer/lint'
require 'active_model/serializer/links'
require 'active_model/serializer/type'
# ActiveModel::Serializer is an abstract class that is # ActiveModel::Serializer is an abstract class that is
# reified when subclassed to decorate a resource. # reified when subclassed to decorate a resource.
@ -17,32 +19,10 @@ module ActiveModel
include Associations include Associations
include Attributes include Attributes
include Caching include Caching
include Links
include Type
require 'active_model/serializer/adapter' require 'active_model/serializer/adapter'
with_options instance_writer: false, instance_reader: false do |serializer|
serializer.class_attribute :_type, instance_reader: true
serializer.class_attribute :_links # @api private : links definitions, @see Serializer#link
self._links ||= {}
end
# Serializers inherit _attribute_mappings, _reflections, and _links.
# Generates a unique digest for each serializer at load.
def self.inherited(base)
base._links = _links.dup
super
end
# @example
# class AdminAuthorSerializer < ActiveModel::Serializer
# type 'authors'
def self.type(type)
self._type = type
end
def self.link(name, value = nil, &block)
_links[name] = block || value
end
# @param resource [ActiveRecord::Base, ActiveModelSerializers::Model] # @param resource [ActiveRecord::Base, ActiveModelSerializers::Model]
# @return [ActiveModel::Serializer] # @return [ActiveModel::Serializer]
# Preferentially returns # Preferentially returns
@ -148,12 +128,6 @@ module ActiveModel
end end
end end
# @api private
# Used by JsonApi adapter to build resource links.
def links
self.class._links
end
protected protected
attr_accessor :instance_options attr_accessor :instance_options

View File

@ -209,7 +209,7 @@ module ActiveModel
end end
def links_for(serializer) def links_for(serializer)
serializer.links.each_with_object({}) do |(name, value), hash| serializer._links.each_with_object({}) do |(name, value), hash|
hash[name] = hash[name] =
if value.respond_to?(:call) if value.respond_to?(:call)
link = Link.new(serializer) link = Link.new(serializer)

View File

@ -0,0 +1,33 @@
module ActiveModel
class Serializer
module Links
extend ActiveSupport::Concern
included do
with_options instance_writer: false, instance_reader: true do |serializer|
serializer.class_attribute :_links # @api private
self._links ||= {}
end
extend ActiveSupport::Autoload
end
module ClassMethods
def inherited(base)
super
base._links = _links.dup
end
# Define a link on a serializer.
# @example
# link :self { "//example.com/posts/#{object.id}" }
# @example
# link :self, "//example.com/user"
#
def link(name, value = nil, &block)
_links[name] = block || value
end
end
end
end
end

View File

@ -0,0 +1,25 @@
module ActiveModel
class Serializer
module Type
extend ActiveSupport::Concern
included do
with_options instance_writer: false, instance_reader: true do |serializer|
serializer.class_attribute :_type # @api private
end
extend ActiveSupport::Autoload
end
module ClassMethods
# Set the JSON API type of a serializer.
# @example
# class AdminAuthorSerializer < ActiveModel::Serializer
# type 'authors'
def type(type)
self._type = type
end
end
end
end
end