class ActiveModel::Serializer
def self._attributes
- See: Serializer::attribute -
Returns:
-
(Array
- Key names of declared attributes)
def self._attributes _attributes_data.keys end
def self.adapter
- See: ActiveModelSerializers::Adapter.lookup -
def self.adapter ActiveModelSerializers::Adapter.lookup(config.adapter) end
def self.associate(reflection)
- Api: - private
Returns:
-
(void)
-
Parameters:
-
reflection
(ActiveModel::Serializer::Reflection
) --
def self.associate(reflection) key = reflection.options[:key] || reflection.name self._reflections[key] = reflection end
def self.attribute(attr, options = {}, &block)
object.edits.last(5)
def recent_edits
end
"#{object.first_name} #{object.last_name}"
attribute :full_name do
attribute :name, key: :title
attributes :id, :recent_edits
class AdminAuthorSerializer < ActiveModel::Serializer
@example
def self.attribute(attr, options = {}, &block) key = options.fetch(:key, attr) _attributes_data[key] = Attribute.new(attr, options, block) end
def self.attributes(*attrs)
class AdminAuthorSerializer < ActiveModel::Serializer
@example
def self.attributes(*attrs) attrs = attrs.first if attrs.first.class == Array attrs.each do |attr| attribute(attr) end end
def self.belongs_to(name, options = {}, &block)
-
(void)
-
Parameters:
-
options
(Hash
) -- for the reflectionany> -
name
(Symbol
) -- of the association
def self.belongs_to(name, options = {}, &block) associate(BelongsToReflection.new(name, options, block)) end
def self.get_serializer_for(klass, namespace = nil)
- Api: - private
def self.get_serializer_for(klass, namespace = nil) return nil unless config.serializer_lookup_enabled cache_key = ActiveSupport::Cache.expand_cache_key(klass, namespace) serializers_cache.fetch_or_store(cache_key) do # NOTE(beauby): When we drop 1.9.3 support we can lazify the map for perfs. lookup_chain = serializer_lookup_chain_for(klass, namespace) serializer_class = lookup_chain.map(&:safe_constantize).find { |x| x && x < ActiveModel::Serializer } if serializer_class serializer_class elsif klass.superclass get_serializer_for(klass.superclass, namespace) else nil # No serializer found end end end
def self.has_many(name, options = {}, &block) # rubocop:disable Style/PredicateName
-
(void)
-
Parameters:
-
options
(Hash
) -- for the reflectionany> -
name
(Symbol
) -- of the association
def self.has_many(name, options = {}, &block) # rubocop:disable Style/PredicateName associate(HasManyReflection.new(name, options, block)) end
def self.has_one(name, options = {}, &block) # rubocop:disable Style/PredicateName
-
(void)
-
Parameters:
-
options
(Hash
) -- for the reflectionany> -
name
(Symbol
) -- of the association
def self.has_one(name, options = {}, &block) # rubocop:disable Style/PredicateName associate(HasOneReflection.new(name, options, block)) end
def self.include_directive_from_options(options)
- Api: - private
def self.include_directive_from_options(options) if options[:include_directive] options[:include_directive] elsif options[:include] JSONAPI::IncludeDirective.new(options[:include], allow_wildcard: true) else ActiveModelSerializers.default_include_directive end end
def self.inherited(base)
def self.inherited(base) super base._attributes_data = _attributes_data.dup base._reflections = _reflections.dup base._links = _links.dup end
def self.link(name, *args, &block)
link(:callback, if: :internal?), { "http://example.com/callback" }
@example
link :resource, "http://example.com/resource"
@example
link(:self) { "http://example.com/resource/#{object.id}" }
@example
link(:self) { resource_url(object) }
@example
Define a link on a serializer.
def self.link(name, *args, &block) options = args.extract_options! # For compatibility with the use case of passing link directly as string argument # without block, we are creating a wrapping block _links[name] = Link.new(name, options, block || ->(_serializer) { args.first }) end
def self.meta(value = nil, &block)
{ comment_count: object.comments.count }
meta do
@example
meta { stuff: 'value' }
class AdminAuthorSerializer < ActiveModel::Serializer
@example
Set the JSON API meta attribute of a serializer.
def self.meta(value = nil, &block) self._meta = block || value end
def self.serialization_adapter_instance
- Api: - private
def self.serialization_adapter_instance @serialization_adapter_instance ||= ActiveModelSerializers::Adapter::Attributes end
def self.serializer_for(resource_or_class, options = {})
-
(ActiveModel::Serializer)
-
Parameters:
-
resource
(ActiveRecord::Base, ActiveModelSerializers::Model
) --
def self.serializer_for(resource_or_class, options = {}) if resource_or_class.respond_to?(:serializer_class) resource_or_class.serializer_class elsif resource_or_class.respond_to?(:to_ary) config.collection_serializer else resource_class = resource_or_class.class == Class ? resource_or_class : resource_or_class.class options.fetch(:serializer) { get_serializer_for(resource_class, options[:namespace]) } end end
def self.serializer_lookup_chain_for(klass, namespace = nil)
- Api: - private
def self.serializer_lookup_chain_for(klass, namespace = nil) lookups = ActiveModelSerializers.config.serializer_lookup_chain Array[*lookups].flat_map do |lookup| lookup.call(klass, self, namespace) end.compact end
def self.serializers_cache
Used to cache serializer name => serializer class
def self.serializers_cache @serializers_cache ||= Concurrent::Map.new end
def self.type(type)
class AdminAuthorSerializer < ActiveModel::Serializer
@example
Set the JSON API type of a serializer.
def self.type(type) self._type = type && type.to_s end
def as_json(adapter_opts = nil)
- See: #serializable_hash -
def as_json(adapter_opts = nil) serializable_hash(adapter_opts) end
def associations(include_directive = ActiveModelSerializers.default_include_directive, include_slice = nil)
-
(Enumerator
-)
Parameters:
-
include_directive
(JSONAPI::IncludeDirective
) -- (defaults to the
def associations(include_directive = ActiveModelSerializers.default_include_directive, include_slice = nil) include_slice ||= include_directive return Enumerator.new {} unless object Enumerator.new do |y| (self.instance_reflections ||= self.class._reflections.deep_dup).each do |key, reflection| next if reflection.excluded?(self) next unless include_directive.key?(key) association = reflection.build_association(self, instance_options, include_slice) y.yield association end end end
def associations_hash(adapter_options, options, adapter_instance)
- Api: - private
def associations_hash(adapter_options, options, adapter_instance) include_directive = options.fetch(:include_directive) include_slice = options[:include_slice] associations(include_directive, include_slice).each_with_object({}) do |association, relationships| adapter_opts = adapter_options.merge(include_directive: include_directive[association.key], adapter_instance: adapter_instance) relationships[association.key] = association.serializable_hash(adapter_opts, adapter_instance) end end
def attributes(requested_attrs = nil, reload = false)
Return the +attributes+ of +object+ as presented
def attributes(requested_attrs = nil, reload = false) @attributes = nil if reload @attributes ||= self.class._attributes_data.each_with_object({}) do |(key, attr), hash| next if attr.excluded?(self) next unless requested_attrs.nil? || requested_attrs.include?(key) hash[key] = attr.value(self) end end
def attributes_hash(_adapter_options, options, adapter_instance)
- Api: - private
def attributes_hash(_adapter_options, options, adapter_instance) if self.class.cache_enabled? fetch_attributes(options[:fields], options[:cached_attributes] || {}, adapter_instance) elsif self.class.fragment_cache_enabled? fetch_attributes_fragment(adapter_instance, options[:cached_attributes] || {}) else attributes(options[:fields], true) end end
def initialize(object, options = {})
If the instance does not have a method named `scope_name`, it
`scope_name` is set as :current_user by default in the controller.
def initialize(object, options = {}) self.object = object self.instance_options = options self.root = instance_options[:root] self.scope = instance_options[:scope] return if !(scope_name = instance_options[:scope_name]) || respond_to?(scope_name) define_singleton_method scope_name, -> { scope } end
def json_key
def json_key root || _type || begin object.class.model_name.to_s.underscore rescue ArgumentError 'anonymous_object' end end
def read_attribute_for_serialization(attr)
def read_attribute_for_serialization(attr) if respond_to?(attr) send(attr) else object.read_attribute_for_serialization(attr) end end
def serializable_hash(adapter_options = nil, options = {}, adapter_instance = self.class.serialization_adapter_instance)
-
(Hash)
- containing the attributes and first level
def serializable_hash(adapter_options = nil, options = {}, adapter_instance = self.class.serialization_adapter_instance) adapter_options ||= {} options[:include_directive] ||= ActiveModel::Serializer.include_directive_from_options(adapter_options) if (fieldset = adapter_options[:fieldset]) options[:fields] = fieldset.fields_for(json_key) end resource = attributes_hash(adapter_options, options, adapter_instance) relationships = associations_hash(adapter_options, options, adapter_instance) resource.merge(relationships) end
def success?
def success? true end