diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 714ff65d..5e56ec17 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -23,6 +23,23 @@ module ActiveModel include Type require 'active_model/serializer/adapter' + with_options instance_writer: false, instance_reader: false do |serializer| + serializer.class_attribute :_meta # @api private : meta definition, @see Serializer#meta + end + + # Register a meta attribute for the corresponding resource. + # + # @param [Hash] hash Optional hash + # @param [Block] block Optional block + def self.meta(hash = nil, &block) + self._meta = + if !block.nil? + block + else + hash + end + end + # @param resource [ActiveRecord::Base, ActiveModelSerializers::Model] # @return [ActiveModel::Serializer] # Preferentially returns @@ -128,6 +145,14 @@ module ActiveModel end end + def meta + if self.class._meta.respond_to?(:call) + instance_eval(&self.class._meta) + else + self.class._meta + end + end + protected attr_accessor :instance_options diff --git a/lib/active_model/serializer/adapter/json_api.rb b/lib/active_model/serializer/adapter/json_api.rb index 744d62e4..b72ec6e1 100644 --- a/lib/active_model/serializer/adapter/json_api.rb +++ b/lib/active_model/serializer/adapter/json_api.rb @@ -157,6 +157,9 @@ module ActiveModel links = links_for(serializer) resource_object[:links] = links if links.any? + meta = serializer.meta + resource_object[:meta] = meta unless meta.nil? + resource_object end